2

这是我的 XML

<root>
   <entry id="1">
      <value name="ID">11</value>
      <value name="ENABLE">0</value>
      <value name="NAME">USER1</value>
   </entry>
   <entry id="2">
      <value name="ID">11</value>
      <value name="ENABLE">0</value>
      <value name="NAME">USER2</value>
   </entry>
   <entry id="3">
      <value name="ID">12</value>
      <value name="ENABLE">0</value>
      <value name="NAME">USER1</value>
   </entry>
</root>

我需要一个 XPath 查询来检索所有11id的名称。

我试过:

String xpath = "/root/entry/value[@name=ID/text()='11']/value[@name='NAME']";
String xpath = "/root/entry/value[@name=ID/text()='11']/NAME";

有人能告诉我我的查询有什么问题吗?

编辑:

预期输出:

USER1
USER2

这两个都有 ID = 11

4

5 回答 5

3
/root/entry[value[@name="ID" and .=11]]/value[@name="NAME"]

或者

/root/entry/value[@name="ID" and .=11]/../value[@name="NAME"]

或者

/descendant::entry[value=11 and value/@name="ID"]/value[@name="NAME"]

或者

//value[.=11]/@name[.="ID"]/ancestor::entry/value[@name="NAME"]

或许多其他变体

于 2013-01-25T02:07:20.297 回答
3

这将是正确的路径:

/root/entry[value[@name = 'ID'] = 11]/value[@name = 'NAME']

要检索节点列表,您需要使用带有 returnType 参数的 xPath.evaluate() 版本:

InputSource document = new InputSource(new FileInputStream("user1.xml"));
String xpath = "/root/entry[value[@name = 'ID'] = 11]/value[@name = 'NAME']";
NodeSet result = (NodeSet)xPath.evaluate(xpath, document, XPathConstants.NODESET); 
for(int index = 0; index < result.getLength(); index ++) {      
    Node node = result.item(index);
    String name = node.getNodeValue();
}
于 2013-01-25T02:41:09.237 回答
1

使用

/*/*[*[@name='ID'] = 11]/*[@name='NAME']

基于 XSLT 的验证

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
  <xsl:copy-of select="/*/*[*[@name='ID'] = 11]/*[@name='NAME']"/>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于提供的 XML 文档时

<root>
    <entry id="1">
        <value name="ID">11</value>
        <value name="ENABLE">0</value>
        <value name="NAME">USER1</value>
    </entry>
    <entry id="2">
        <value name="ID">11</value>
        <value name="ENABLE">0</value>
        <value name="NAME">USER2</value>
    </entry>
    <entry id="3">
        <value name="ID">12</value>
        <value name="ENABLE">0</value>
        <value name="NAME">USER1</value>
    </entry>
</root>

对 XPath 表达式求值,并将该求值的结果(所有选定节点)复制到输出

<value name="NAME">USER1</value>
<value name="NAME">USER2</value>
于 2013-01-25T04:36:49.847 回答
0

试试这个,

String xpath = "/root/entry[value[@name='ID' and text()='11']]/value[@name="NAME"]";

于 2013-01-25T01:54:13.177 回答
0

采用:

//entry[value[@name = 'ID'] = 11]/value[@name = 'NAME']
于 2013-01-25T05:30:32.467 回答