XML使用xmllint从多个列表项中的变量中获取多个值

时间:2017-07-10 12:01:39

标签: bash xpath 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

谢谢你,最诚挚的问候, 菲利克斯

2 个答案:

答案 0 :(得分:0)

schema

使用&gt;设置为字段分隔符,我们模式匹配“域”或“名称”或“权限”,然后如果满足这些条件,我们进一步拆分字符串基于&lt;作为分隔符。然后印有尾随;在所有情况下,除了添加尾随回车符时会遇到“权限”。

答案 1 :(得分:0)

I'm not sure if that's possible with xmllint. It's easy with xmlstarlet...

xmlstarlet sel -t -m "/config/list/listitem" -v "concat(variable[@name='Name'],';',variable[@name='Domain'],';',variable[@name='Rights'])" -n input.xml