gpt4 book ai didi

java - 如何避免使用 xpath 在节点之间返回空格和行返回?

转载 作者:太空宇宙 更新时间:2023-11-04 13:53:50 25 4
gpt4 key购买 nike

我正在尝试学习使用 Java xpath,但遇到了问题。当我使用 getNodeName 和 getTextContent 时,我最终会抓取节点之间出现的空格和换行符。例如,如果我的 XML 如下所示:

<node-i-am-looking-for-in-my-xml>
<parent-node-01>
<child-node-01>
some text
</child-node>
<child-node-02>
some more text
</child-node>
<child-node-03>
even more text
</child-node>
</parent-node-01>
<parent-node-02>
<child-node-01>
some text
</child-node>
<child-node-02>
some more text
</child-node>
<child-node-03>
even more text
</child-node>
</parent-node-02>
<parent-node-03>
<child-node-01>
some text
</child-node>
<child-node-02>
some more text
</child-node>
<child-node-03>
even more text
</child-node>
</parent-node-03>
</node-i-am-looking-for-in-my-xml>

使用 getNodeName 时得到的结果如下:

child-node-01
#text
child-node-02
#text
child-node-03
#text

当我使用 getTextContent 时,它看起来像:

some text

some more text

even more text

这是我正在使用的代码:

public static void main(String[] args) throws Exception {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setValidating(false);
DocumentBuilder db = dbf.newDocumentBuilder();
String filename = "C:\\Users\\Me\\file.xml";
Document doc = db.parse(new FileInputStream(new File(filename)));
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
String expression;
Node node;
NodeList nodeList;

expression = "//node-i-am-looking-for/*";
nodeList = (NodeList) xpath.evaluate(expression, doc, XPathConstants.NODESET);
System.out.println("nodeList.getLength(): " + nodeList.getLength());
for (int i = 0; i < nodeList.getLength(); i++) {
for(int j=1; j<(nodeList.item(i).getChildNodes().getLength()); j++){
Node nowNode = nodeList.item(i).getChildNodes().item(j);
System.out.println(nowNode.getNodeName() + ":" + nowNode.getTextContent());
}
}
}

环顾 Google,我似乎需要使用“标准化空间”,但我不知道如何实现它。

最佳答案

正如您所见,空格在 XML 文本节点中很重要。 child-node-01 的文本内容(或者更准确地说,父节点为 child-node-01 的文本节点的内容)实际上是 '\n some text\n '

如果您需要处理 XPath 表达式中的空白,则只能使用 normalize-space,因为 normalize-space 是一个 XPath 函数。例如,如果您想要选择文本内容(去除前导/尾随空格)为 'some data' 的所有节点,您可以使用如下 XPath:

//*[normalize-space(.) = 'some data']

但是当您检索文本内容时,您已经脱离了 XPath 世界,回到了 Java,因此您可能会更好:

nowNode.getTextContent().trim()

关于java - 如何避免使用 xpath 在节点之间返回空格和行返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30032220/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com