0

我有以下结构的 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下面的标签并存储@Nameand @Price。如果是material_class = "book",则迭代其Book下方的标签。我也想获得/Root/Commodity/Commodity标签数量的长度(在这种情况下,它是两个)。任何帮助表示赞赏。我是 XPath 的新手。

4

2 回答 2

1

要获取 Book@Name@Pricefor @material_class='sub'or @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 的性能要好得多,而且更容易实现。

于 2012-06-27T18:26:29.797 回答
0
<xsl:apply-templates select="//Sample[Materil[@material_class='sub']]/Book"/>
<xsl:apply-templates select="//Sample[Materil[@material_class='book']]/Book"/>

我现在没有访问 XSL 编辑器的权限,所以没有测试上述内容,但它会给你一个想法。选择书,并用您想要的条件约束材料。

于 2012-06-27T18:07:38.343 回答