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