我想用XPath阅读Sitemap但它不起作用。 这是我的代码:
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());
}
}
在检索站点地图的远程源之前,它通过变量src传递给evaluate2。
并且System.out.println(nodes.getLength());
显示0
我的xpath查询正在运行,因为此查询在PHP中有效。
你看到我的代码中有错误吗?
由于
答案 0 :(得分:1)
您使用名称空间感知解析器解析站点地图(这是factory.setNamespaceAware(true)
所做的),然后尝试使用不使用名称空间解析程序(或引用任何名称空间)的XPath来访问它。
最简单的解决方案是将解析器配置为不支持名称空间。只要您只是解析一个自包含的站点地图,这应该不是问题。
代码中的另一个问题是您将站点地图内容作为String传递,然后使用平台默认编码转换该String。只要您的platform-default编码与从服务器检索的实际字节数相匹配,这将起作用(假设您还使用platform-default编码创建了字符串)。如果没有,则可能会出现转换错误。
答案 1 :(得分:1)
我认为输入有命名空间。因此,您必须初始化xpath对象的namespaceContext并使用前缀更改xpath。即// usr / loc应为// ns:url / ns:loc 然后在命名空间对象中添加命名空间前缀绑定。
你可以找到一个带有apache common的NamespaceContext实现。 http://ws.apache.org/commons/util/apidocs/index.html WS-公地utils的
NamespaceContextImpl namespaceContextObj = new NamespaceContextImpl();
nsContext.startPrefixMapping("ns", "http://sitename/xx");
xpath.setNamespaceContext(namespaceContextObj);
XPathExpression expr = xpath.compile(“// ns:url / ns:loc”);
如果您不知道要提交的命名空间,您可以从文档中获取它们,但我怀疑它会有多大用处。这里的方法很少 http://www.ibm.com/developerworks/xml/library/x-nmspccontext/index.html
答案 2 :(得分:0)
我在代码中看不到任何错误,所以我猜这个问题就是源代码。 您确定源文件包含此元素吗?
也许您可以尝试使用此代码来解析文档中的String
builder.parse(new InputSource(new StringReader(xml)));