Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在XPath表达式Java中使用整数变量从具有名称空间的重复节点提取信息_Java_Xpath - Fatal编程技术网

在XPath表达式Java中使用整数变量从具有名称空间的重复节点提取信息

在XPath表达式Java中使用整数变量从具有名称空间的重复节点提取信息,java,xpath,Java,Xpath,解决了!谢谢你们 你的建议使我找到了答案。所以你们所有人的建议都值得感谢 放置int变量的解决方案如下: //Put my xpath into a string variable where it can evaluate my integer "counter" String myString = "/*[local-name()='root' and namespace-uri()='DK']/*[local-name()='book' and namespace-uri()='DK']

解决了!谢谢你们

你的建议使我找到了答案。所以你们所有人的建议都值得感谢

放置int变量的解决方案如下:

//Put my xpath into a string variable where it can evaluate my integer "counter"

String myString = "/*[local-name()='root' and namespace-uri()='DK']/*[local-name()='book' and namespace-uri()='DK']" + counter + "]/*[local-name()='item1' and namespace-uri()='DK']/*[local-name()='item2' and namespace-uri()='DK']/*[local-name()='date' and namespace-uri()='DK'][" + counter + "]"


//Then simply put that string variable into the xpath expression.
System.out.print(myString); 
原问题如下:

首先,我感谢任何帮助。提前感谢您的帮助

我有一个需要解析的XML文件

比如说

<root xmlns="DK">
  <book>
    <item1>
      <item2>
        <date>xxx
        </date>
        <date>x1x1x1
        </date>
      </item2>
    </item1>
  </book>
  <book>
    <item1>
      <item2>
        <date>yyy
        </date>
        <date>y1y1y1
        </date>
      </item2>
    </item1>
  </book>    
</root>
我的问题就在这里。因为有几个重复的节点是嵌套的,它们的名称完全相同,所以我使用一个整数计数器变量按编号将它们取出来

我的XPath表达式不理解我正在输入一个整数变量“counter”

我可以用什么语法来实现这一点吗? 还是不可能

提前谢谢


DK

我在代码中没有看到对的任何调用,只是注释中有一个非常混乱的XPath表达式

以下代码为您获取每个第一个
节点列表

请注意,XPath从1开始计数,因此
date[1]
是第一个元素,而不是Java中的第二个元素

如果您不需要名称空间感知,可以只使用
“/root/book/item1/item2/date[1]”
(并且可能会删除对
DocumentBuilderFactory.setNamespaceAware(true);
或等效项的调用)


如果
item2
在整个文档中是唯一的,您甚至可以将XPath表达式简化为
“//item2/date[1]
”(对于NS感知,请在两个路径段前面加上
DK:
,如上所述)。

您可以在XPath表达式中引用变量
$counter
,您可以通过定义XPathVariableResolver并将其与XPathFactory关联来设置Java API中变量的值。

即使存在事先未知的嵌套,也可以使用XPath表达式,如:

(//*[local-name()='root' and namespace-uri()='DK'])[$k]
其中,
$k
可替换为正整数

注意事项

  • 以上表达式中的括号是必需的

  • < > XPath中的索引是基于1的,不是基于0的,如C或C++。< /P>
    为了正确地实现名称空间感知,他还必须将前缀绑定到名称空间。我不知道为什么,因为语法看起来正确。。。一定是我做错了什么,您是否按照Michael Kay的建议,以将变量名链接到您的计数器的方式实现了
    XPathVariableResolver
    ?对不起,我正在执行getStringValue();在上面。如果我输入一个[$k],它将返回'null',但如果我输入一个实际的数字,它将起作用。我还没有试过XPathVariableResolver。。。我现在正在研究它。@DKImportant:是的,您应该将值转换为字符串。在C#中,我会写:
    string.format((//*[local-name()='root'和namespace-uri()='DK'])[$k]”,I)
    
    XPath xpath = XPathFactory.newInstance().newXPath();
    NodeList dates = (NodeList) xpath.evaluate("/DK:root/DK:book/DK:item1/DK:item2/DK:date[1]", document, XPathConstants.NODESET);
    
    for (int i = 0; i < dates.getLength(); i++) {
        Node item = dates.item(i);
        String content = item.getTextContent().trim();
        System.err.println(content);
    }
    
    xxx
    yyy
    
    (//*[local-name()='root' and namespace-uri()='DK'])[$k]