Java 使用XPath读取站点地图
我想用XPath阅读站点地图,但它不起作用。 这是我的密码:Java 使用XPath读取站点地图,java,xml,xpath,Java,Xml,Xpath,我想用XPath阅读站点地图,但它不起作用。 这是我的密码: private void evaluate2(String src){ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); try{ DocumentBuilder builder = factory.newDocumentBuilder(
private void evaluate2(String src){
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
try{
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new ByteArrayInputStream(src.getBytes()));
System.out.println(src);
XPathFactory xp_factory = XPathFactory.newInstance();
XPath xpath = xp_factory.newXPath();
XPathExpression expr = xpath.compile("//url/loc");
Object result = expr.evaluate(doc, XPathConstants.NODESET);
NodeList nodes = (NodeList) result;
System.out.println(nodes.getLength());
for (int i = 0; i < nodes.getLength(); i++) {
items.add(nodes.item(i).getNodeValue());
System.out.println(nodes.item(i).toString());
}
}catch(Exception e){
System.out.println(e.getMessage());
}
}
private void evaluate2(字符串src){
DocumentBuilderFactory工厂=DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
试一试{
DocumentBuilder=factory.newDocumentBuilder();
Document doc=builder.parse(新的ByteArrayInputStream(src.getBytes());
系统输出打印LN(src);
XPathFactory xp_factory=XPathFactory.newInstance();
XPath=xp_factory.newXPath();
XPathExpression expr=xpath.compile(“//url/loc”);
Object result=expr.evaluate(doc,XPathConstants.NODESET);
节点列表节点=(节点列表)结果;
System.out.println(nodes.getLength());
对于(int i=0;i
在检索站点地图的远程源之前,它通过变量src传递给evaluate2。
以及System.out.println(nodes.getLength())代码>显示0
我的xpath查询正在工作,因为该查询在PHP中工作。
你看到我的代码中有错误吗
谢谢我看不到您的代码中有任何错误,因此我认为问题是源代码。
是否确定源文件包含此元素
也许您可以尝试使用此代码来解析文档中的字符串
builder.parse(new InputSource(new StringReader(xml)));
您可以使用名称空间感知解析器(factory.setNamespaceAware(true)
就是这样做的)解析站点地图,但随后尝试使用不使用名称空间解析程序(或引用任何名称空间)的XPath访问它
最简单的解决方案是将解析器配置为不知道名称空间。只要您只是在解析一个自包含的站点地图,这应该不会是一个问题
代码中的另一个问题是,您将站点地图内容作为字符串传递,然后使用平台默认编码转换该字符串。只要您的平台默认编码与从服务器检索到的实际字节的编码相匹配(假设您也使用平台默认编码创建了字符串),这就可以工作。如果没有,则可能会出现转换错误。我认为输入具有名称空间。因此,您必须初始化xpath对象的名称空间上下文,并使用前缀更改xpath。i、 e.//usr/loc应该是//ns:url/ns:loc 然后在名称空间对象中添加名称空间前缀绑定 您可以在apache common中找到可用的NamespaceContext实现。 ws-commons-utils
NamespaceContextImpl namespaceContextObj = new NamespaceContextImpl();
nsContext.startPrefixMapping("ns", "http://sitename/xx");
xpath.setNamespaceContext(namespaceContextObj);
XPathExpression expr=xpath.compile(“//ns:url/ns:loc”)
如果您不知道将使用什么名称空间,您可以从文档中自己获取它们,但我怀疑它是否有多大用处。这里几乎没有什么诀窍
如果我这样做了,并放入一个
System.out.println(doc.toString())代码>我收到了消息[#文档:null]
正常吗?不,这不正常。它表示您的文档对象为空。因此,请尝试使用pasifal(setNameSpaceAware(false))的提示,但是名称空间可能会根据站点地图版本的不同而有所不同?