gpt4 book ai didi

java - 使用已编译的 XPATH 表达式解析 XML 文件时遇到问题?

转载 作者:行者123 更新时间:2023-12-02 07:46:27 25 4
gpt4 key购买 nike

我正在处理a tutorial并遇到了一个我预计会起作用的问题。我希望有人可以帮助我处理这段代码。我无法克服这一点。如果我使用 XPATH 表达式“//*/text()”,我在下面共享的这段代码将匹配,但当我比该表达式更具体并使用“//tag0”时,它无法匹配:G/text()"。知道我做错了什么吗?我只是想从下面提供的 XML 中获取 2 个“tag0:G”值:

import java.io.IOException;
import java.io.StringReader;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
public class Test1 {
public static void main(String[] args) {
System.out.println("Test start...");
String myXML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">" +
"<soapenv:Body>" +
"<tag0:getA xmlns:tag0=\"http://me.ws.ix\">" +
"<tag0:B>" +
"<tag0:CC>" +
"<tag0:CC>" +
"<tag0:D>false</tag0:D>" +
"<tag0:E>false</tag0:E>" +
"<tag0:F xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\"/>" +
"<tag0:G>10001</tag0:G>" +
"<tag0:H>7744000002</tag0:H>" +
"</tag0:CC>" +
"<tag0:CC>" +
"<tag0:D>false</tag0:D>" +
"<tag0:E>false</tag0:E>" +
"<tag0:F xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\"/>" +
"<tag0:G>20002</tag0:G>" +
"<tag0:H>1111122222</tag0:H>" +
"</tag0:CC>" +
"</tag0:CC>" +
"<tag0:I>2012-05-27 23:38:48</tag0:I>" +
"</tag0:B>" +
"</tag0:getA>" +
"</soapenv:Body>" +
"</soapenv:Envelope>";

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
Document doc = null;
NodeList nodes = null;
try {
doc = factory.newDocumentBuilder().parse( new InputSource( new StringReader( myXML) ) );
XPathExpression expr = XPathFactory.newInstance().newXPath()
.compile("//tag0:G/text()"); // this fails, I don't know why
nodes = (NodeList)expr.evaluate(doc, XPathConstants.NODESET);
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (XPathExpressionException e) {
e.printStackTrace();
}
System.out.println("Nodes length: " + nodes.getLength() );
for (int i = 0; i < nodes.getLength(); i++) {
String val = nodes.item(i).getNodeValue();
System.out.println( "Val: " + val );
}
System.out.println("Test end...");
}
}

最佳答案

在开始编译 XPath 表达式之前,您应该注册一个 NamespaceContext 在您的 XPath 实例上。您可以使用 XPath#setNamespaceContext(NamespaceContex nsContext) 来完成此操作.

请阅读using NamespaceContext chapter参见 xml.apache.org。

这个想法是,当您的文档使用 namespace 信息进行解析时,XPath 执行器需要知道如何将您使用的前缀与您运行它的文档中的 namespace URI 相匹配。前缀本身没有任何意义,您可以使用任意前缀,只要它映射到相同的 URI。

附:这里有更多矿石 Namespaces in XML .

关于java - 使用已编译的 XPATH 表达式解析 XML 文件时遇到问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10778165/

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