我有一个以下结构的xml:
<Root>
<Sample>
<Materil material_class="book" />
<Book Name="harry" Price="8" />
<Book Name="small things" Price="9" />
<Book Name="snow" Price="10" />
</Sample>
<Commodity>
<Sample>
<Materil material_class="sub" />
<Book Name="sherin" Price="8" />
<Book Name="bigthings" Price="9" />
<Book Name="leopard" Price="10" />
</Sample>
<Commodity>
<Sample>
<Materil material_class="sub" />
<Book Name="azxcv" Price="86" />
<Book Name="ddddd" Price="79" />
<Book Name="qwert" Price="810" />
</Sample>
</Commodity>
<Commodity>
<Sample>
<Materil material_class="subtwo" />
<Book Name="ratnam" Price="86" />
<Book Name="shantharam" Price="99" />
<Book Name="da vinci" Price="10" />
</Sample>
</Commodity>
</Commodity>
</Root>
有没有办法根据条件迭代此xml,如果material_class = "sub"
,则迭代下面的Book
标记并存储@Name
和@Price
。如果是material_class = "book"
,请重复下面的Book
标记。另外,我想得到/Root/Commodity/Commodity
标签的长度(在这种情况下,它是两个)。任何帮助表示赞赏。我是XPath的新手。
答案 0 :(得分:1)
要获取@Name
或@Price
的图书@material_class='sub'
和@material_class='book'
,请使用此XPATH
/Root[descendant-or-self::Sample or Sample[descendant-or-self::*]]//*[Materil[@material_class='sub' or @material_class='book']]/Book
或强>
//Sample[Materil[@material_class='book' or @material_class='sub']]/Book
加载此XPATH后,打印名称使用@Name
和价格使用@Price
要获取/ Root / Commodity / Commodity标签的长度,XPATH是
/Root/Commodity/Commodity
或强>
//Commodity/Commodity
NodeList node = (NodeList) xpath.evaluate("/Root/Commodity/Commodity", xml, XPathConstants.NODESET);
count = node.getLength(); // OUTPUTS: 2
为了您的信息,实际通过XSLT呈现XML的性能要好得多,而且更容易实现。
答案 1 :(得分:0)
<xsl:apply-templates select="//Sample[Materil[@material_class='sub']]/Book"/>
<xsl:apply-templates select="//Sample[Materil[@material_class='book']]/Book"/>
我现在无法访问XSL编辑器,所以没有测试过上面的内容,但它会给你一个想法。选择Book,并使用您想要的条件约束Materil。