Java 使用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(

我想用XPath阅读站点地图,但它不起作用。 这是我的密码:

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))的提示,但是名称空间可能会根据站点地图版本的不同而有所不同?