如何使用xmlstarlet选择具有相同名称的多个元素?

如何使用xmlstarlet选择具有相同名称的多个元素?,xml,xmlstarlet,Xml,Xmlstarlet,我有以下xml: <a> <TICKET_LIST> <TICKET> <NUMBER>182820</NUMBER> <DETECTION> <IP network_id="173230">192.168.140.61</IP> <DNSNAME><![CDATA[local]]></DNSNAME&g

我有以下xml:

<a>
  <TICKET_LIST>
    <TICKET>
      <NUMBER>182820</NUMBER>
      <DETECTION>
        <IP network_id="173230">192.168.140.61</IP>
        <DNSNAME><![CDATA[local]]></DNSNAME>
        <PORT>80</PORT>
        <SERVICE>CGI</SERVICE>
        <PROTOCOL>tcp</PROTOCOL>
      </DETECTION>
      <VULNINFO>
        <TITLE><![CDATA[HTTP TRACE / TRACK Methods Enabled]]></TITLE>
        <TYPE>VULN</TYPE>
        <QID>12680</QID>
        <SEVERITY>3</SEVERITY>
        <STANDARD_SEVERITY>3</STANDARD_SEVERITY>
        <CVE_ID_LIST>
          <CVE_ID><![CDATA[CVE-2004-2320]]></CVE_ID>
          <CVE_ID><![CDATA[CVE-2010-0386]]></CVE_ID>
          <CVE_ID><![CDATA[CVE-2003-1567]]></CVE_ID>
        </CVE_ID_LIST>
      </VULNINFO>
    </TICKET>
    <TICKET>
      <NUMBER>182957</NUMBER>
      <DETECTION>
        <IP network_id="173230">192.168.200.46</IP>
        <DNSNAME><![CDATA[local]]></DNSNAME>
        <PORT>443</PORT>
        <SERVICE>Web server</SERVICE>
        <PROTOCOL>tcp</PROTOCOL>
      </DETECTION>
      <VULNINFO>
        <TITLE><![CDATA[Web Server Uses Plain-Text Form Based Authentication]]></TITLE>
        <TYPE>VULN</TYPE>
        <QID>86728</QID>
        <SEVERITY>3</SEVERITY>
        <STANDARD_SEVERITY>3</STANDARD_SEVERITY>
      </VULNINFO>
    </TICKET>
  </TICKET_LIST>
</a>
然而,我也对同一行上的所有CVE_ID数据和其余数据感兴趣

我现在得到的结果是:

182820,192.168.140.61,local,CGI,80,HTTP TRACE / TRACK Methods Enabled,12680
182957,192.168.200.46,local,Web server,443,Web Server Uses Plain-Text Form Based Authentication,86728
预期结果是:

182820,192.168.140.61,local,CGI,80,HTTP TRACE / TRACK Methods Enabled,12680,CVE-2004-2320 CVE-2010-0386 CVE-2003-1567
182957,192.168.200.46,local,Web server,443,Web Server Uses Plain-Text Form Based Authentication,86728
182820,192.168.140.61,local,CGI,80,HTTP TRACE / TRACK Methods Enabled,12680,CVE-2004-2320 CVE-2010-0386 CVE-2003-1567
182957,192.168.200.46,local,Web server,443,Web Server Uses Plain-Text Form Based Authentication,86728

由于存在多个
CVE\u ID
元素,因此需要添加另一个匹配(
-m
)匹配
VULNINFO/CVE\u ID\u LIST/CVE\u ID

此外,要使换行符(
-n
)正确输出,您必须中断嵌套(
-b

例如

xmlstarlet sel -T -t -m /a/TICKET_LIST/TICKET -v "concat(NUMBER,',',DETECTION/IP,',',DETECTION/DNSNAME,',',DETECTION/SERVICE,',',DETECTION/PORT,',',VULNINFO/TITLE,',',VULNINFO/QID,',')" -m VULNINFO/CVE_ID_LIST/CVE_ID -v "concat(.,' ')" -b -n file.xml
输出

182820,192.168.140.61,local,CGI,80,HTTP TRACE / TRACK Methods Enabled,12680,CVE-2004-2320 CVE-2010-0386 CVE-2003-1567
182957,192.168.200.46,local,Web server,443,Web Server Uses Plain-Text Form Based Authentication,86728,
如果您看到xmlstarlet内部使用的XSLT(
-C
),那么命令行可能更有意义


请注意,输出的第二行后面有一个
。我不认为这是个问题,因为CSV行的列数都是相同的

如果出现问题,您可以使用“If”(
-i
)并在处理它们之前检查是否存在任何
CVE\u ID

xmlstarlet sel -T -t -m /a/TICKET_LIST/TICKET -v "concat(NUMBER,',',DETECTION/IP,',',DETECTION/DNSNAME,',',DETECTION/SERVICE,',',DETECTION/PORT,',',VULNINFO/TITLE,',',VULNINFO/QID)" -i VULNINFO/CVE_ID_LIST/CVE_ID -o "," -m VULNINFO/CVE_ID_LIST/CVE_ID -v "concat(.,' ')" -b -n file.xml
输出与上面相同,只是后面的
未在第二行输出


由于存在多个
CVE\u ID
元素,因此需要添加另一个匹配(
-m
)匹配
VULNINFO/CVE\u ID\u LIST/CVE\u ID

此外,要使换行符(
-n
)正确输出,您必须中断嵌套(
-b

例如

xmlstarlet sel -T -t -m /a/TICKET_LIST/TICKET -v "concat(NUMBER,',',DETECTION/IP,',',DETECTION/DNSNAME,',',DETECTION/SERVICE,',',DETECTION/PORT,',',VULNINFO/TITLE,',',VULNINFO/QID,',')" -m VULNINFO/CVE_ID_LIST/CVE_ID -v "concat(.,' ')" -b -n file.xml
输出

182820,192.168.140.61,local,CGI,80,HTTP TRACE / TRACK Methods Enabled,12680,CVE-2004-2320 CVE-2010-0386 CVE-2003-1567
182957,192.168.200.46,local,Web server,443,Web Server Uses Plain-Text Form Based Authentication,86728,
如果您看到xmlstarlet内部使用的XSLT(
-C
),那么命令行可能更有意义


请注意,输出的第二行后面有一个
。我不认为这是个问题,因为CSV行的列数都是相同的

如果出现问题,您可以使用“If”(
-i
)并在处理它们之前检查是否存在任何
CVE\u ID

xmlstarlet sel -T -t -m /a/TICKET_LIST/TICKET -v "concat(NUMBER,',',DETECTION/IP,',',DETECTION/DNSNAME,',',DETECTION/SERVICE,',',DETECTION/PORT,',',VULNINFO/TITLE,',',VULNINFO/QID)" -i VULNINFO/CVE_ID_LIST/CVE_ID -o "," -m VULNINFO/CVE_ID_LIST/CVE_ID -v "concat(.,' ')" -b -n file.xml
输出与上面相同,只是后面的
未在第二行输出