XML 使用 xmllint 从多个列表项中的变量获取多个值
XML get multiple values from variables inside of multiple listitems with xmllint
我在使用 xmllint --xpath 时遇到了一些问题。
我不明白语法必须如何寻找以下场景:
给出以下XML:
<config>
<list name="User">
<listitem>
<variable name="Name">admin</variable>
<variable name="Domain">testdomain.ch</variable>
<variable name="Account_enabled">1</variable>
<variable name="Auth_type">0</variable>
<variable name="PIN"></variable>
<variable name="Rights">3</variable>
<variable name="Authorization">kms.autodelete.deleteditems.days=30</variable>
<variable name="Authorization">kms.autodelete.junkemail.days=30</variable>
<variable name="Groups">gruppe</variable>
<variable name="MailAddress">administrator</variable>
<variable name="ForwardMode">0</variable>
<variable name="HomeServer"></variable>
<variable name="MailboxLocation"></variable>
<variable name="Qstorage">0</variable>
<variable name="Qmessage">0</variable>
<variable name="MaxOutgoingMessageSize">0</variable>
<variable name="DefSpamFilter">1</variable>
<variable name="ReplyToAddress"></variable>
<variable name="Fullname">XXX</variable>
<variable name="Description"></variable>
<variable name="KrbUserPrincipalName"></variable>
</listitem>
<listitem>
<variable name="Name">postmaster</variable>
<variable name="Domain">testdomain2.ch</variable>
<variable name="Account_enabled">1</variable>
<variable name="Auth_type">0</variable>
<variable name="PIN"></variable>
<variable name="Rights">0</variable>
<variable name="Authorization">kms.webadmin</variable>
<variable name="ForwardMode">0</variable>
<variable name="HomeServer"></variable>
<variable name="MailboxLocation"></variable>
<variable name="Qstorage">0</variable>
<variable name="Qmessage">0</variable>
<variable name="MaxOutgoingMessageSize">0</variable>
<variable name="DefSpamFilter">1</variable>
<variable name="PreferredAddress"></variable>
<variable name="ReplyToAddress"></variable>
<variable name="Fullname"></variable>
<variable name="Description"></variable>
<variable name="KrbUserPrincipalName"></variable>
</listitem>
我需要得到以下输出:
Name;Domain;Rights
在这个例子中,输出应该是:
admin;testdomain.ch;3
postmaster;testdomain2.ch;0
谢谢你,并致以最诚挚的问候,
菲利克斯
awk -F\> '[=10=] ~ /"Domain"/ || [=10=] ~ /"Name"/ || [=10=] ~ /"Rights"/ { split(,slts,"<");if ( [=10=] ~ /"Rights"/ ) { printf "%s\n",slts[1] } else { printf "%s;",slts[1] } } ' filename
将 > 设置为字段分隔符,我们对 "Domain" OR "Name" OR "Rights" 进行模式匹配,然后如果满足这些条件,我们进一步根据 < 将字符串拆分为分隔符。然后打印尾随 ;在除此之外的所有情况下,在添加尾部回车 return 时都会遇到 "Rights"。
我不确定 xmllint 是否可行。 xmlstarlet...
很容易
xmlstarlet sel -t -m "/config/list/listitem" -v "concat(variable[@name='Name'],';',variable[@name='Domain'],';',variable[@name='Rights'])" -n input.xml
我在使用 xmllint --xpath 时遇到了一些问题。 我不明白语法必须如何寻找以下场景:
给出以下XML:
<config>
<list name="User">
<listitem>
<variable name="Name">admin</variable>
<variable name="Domain">testdomain.ch</variable>
<variable name="Account_enabled">1</variable>
<variable name="Auth_type">0</variable>
<variable name="PIN"></variable>
<variable name="Rights">3</variable>
<variable name="Authorization">kms.autodelete.deleteditems.days=30</variable>
<variable name="Authorization">kms.autodelete.junkemail.days=30</variable>
<variable name="Groups">gruppe</variable>
<variable name="MailAddress">administrator</variable>
<variable name="ForwardMode">0</variable>
<variable name="HomeServer"></variable>
<variable name="MailboxLocation"></variable>
<variable name="Qstorage">0</variable>
<variable name="Qmessage">0</variable>
<variable name="MaxOutgoingMessageSize">0</variable>
<variable name="DefSpamFilter">1</variable>
<variable name="ReplyToAddress"></variable>
<variable name="Fullname">XXX</variable>
<variable name="Description"></variable>
<variable name="KrbUserPrincipalName"></variable>
</listitem>
<listitem>
<variable name="Name">postmaster</variable>
<variable name="Domain">testdomain2.ch</variable>
<variable name="Account_enabled">1</variable>
<variable name="Auth_type">0</variable>
<variable name="PIN"></variable>
<variable name="Rights">0</variable>
<variable name="Authorization">kms.webadmin</variable>
<variable name="ForwardMode">0</variable>
<variable name="HomeServer"></variable>
<variable name="MailboxLocation"></variable>
<variable name="Qstorage">0</variable>
<variable name="Qmessage">0</variable>
<variable name="MaxOutgoingMessageSize">0</variable>
<variable name="DefSpamFilter">1</variable>
<variable name="PreferredAddress"></variable>
<variable name="ReplyToAddress"></variable>
<variable name="Fullname"></variable>
<variable name="Description"></variable>
<variable name="KrbUserPrincipalName"></variable>
</listitem>
我需要得到以下输出:
Name;Domain;Rights
在这个例子中,输出应该是:
admin;testdomain.ch;3
postmaster;testdomain2.ch;0
谢谢你,并致以最诚挚的问候, 菲利克斯
awk -F\> '[=10=] ~ /"Domain"/ || [=10=] ~ /"Name"/ || [=10=] ~ /"Rights"/ { split(,slts,"<");if ( [=10=] ~ /"Rights"/ ) { printf "%s\n",slts[1] } else { printf "%s;",slts[1] } } ' filename
将 > 设置为字段分隔符,我们对 "Domain" OR "Name" OR "Rights" 进行模式匹配,然后如果满足这些条件,我们进一步根据 < 将字符串拆分为分隔符。然后打印尾随 ;在除此之外的所有情况下,在添加尾部回车 return 时都会遇到 "Rights"。
我不确定 xmllint 是否可行。 xmlstarlet...
很容易xmlstarlet sel -t -m "/config/list/listitem" -v "concat(variable[@name='Name'],';',variable[@name='Domain'],';',variable[@name='Rights'])" -n input.xml