2

这是xml片段:

$ cat short.xml 
<hostnames>
    <hostname name="yahoo.com" type="user"/>
    <hostname name="ir1.fp.vip.sp2.yahoo.com" type="PTR"/>
</hostnames>
<hostnames>
    <hostname name="Inc.com" type="user"/>
    <hostname name="www.inc.com" type="PTR"/>
</hostnames>

所需的输出是:

yahoo.com | ir1.fp.vip.sp2.yahoo.com
Inc.com | www.inc.com

到目前为止我所拥有的只是部分工作:$ xml sel -t -m "//hostname" -v "@name" -n short.xml

我似乎无法正确捕获 Type= 条件。TIA。

4

3 回答 3

4

另外两个仅使用一次 xmlstarlet 的解决方案(无需迭代):

xmlstr='
<root>
  <hostnames>
    <hostname name="yahoo.com" type="user"/>
    <hostname name="ir1.fp.vip.sp2.yahoo.com" type="PTR"/>
  </hostnames>
  <hostnames>
    <hostname name="Inc.com" type="user"/>
    <hostname name="www.inc.com" type="PTR"/>
  </hostnames>
</root>
'

echo "$xmlstr" | xmlstarlet sel -T -t -m "//hostnames" -m "hostname[@type='user']" -v '@name' -o " | " -b -m "hostname[@type='PTR']" -v '@name' -n

echo "$xmlstr" | xmlstarlet sel -T -t -m "//hostname" -i "@type='user'" -v '@name' -o " | " -b -i "@type='PTR'" -v '@name' -n
于 2011-03-15T13:31:52.230 回答
3

您需要用 or 来计算主机名,xmlstarlet el然后使用以下内容进行迭代:

xmlstarlet sel -t -c "//hostnames[1]" short.xml | xmlstarlet sel -t -m "//hostname/@name" -v . -o ' | '

如果 XML 设计得更好,这将容易得多。:)

于 2011-02-04T23:10:52.537 回答
0

有问题的示例是无效的 xml。

xmlstarlet --version
1.3.1
compiled against libxml2 2.8.0, linked with 20800
compiled against libxslt 1.1.26, linked with 10126
xmlstarlet val -e short.xml 
short.xml:5.1: Extra content at the end of the document
<hostnames>
^
short.xml - invalid

mitm的答案中的想法是非常好的治疗方法。

于 2013-01-16T13:19:53.793 回答