2010-06-28 51 views
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“//主机名”-v“@name”-n short.xml

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

回答

3

您需要xmlstarlet el什么来算的主机名,然后用类似迭代:

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

这将是一个容易得多,如果XML是更好的设计。 :)使用xmlstarlet只有一次

+0

这很有帮助。谢谢。 – galaxywatcher 2011-03-05 18:55:05

4

两个更多的解决方案(不需要重复):

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 
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 

answer通过中间人的想法是相当不错的治疗。