xpath基于java中的条件

时间:2012-06-27 17:46:14

标签: java xml xpath

我有一个以下结构的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的新手。

2 个答案:

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

JAVA:

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。