【问题标题】:Issue with XML parsing using Commons JXPath使用 Commons JXPath 解析 XML 的问题
【发布时间】:2011-09-21 00:45:07
【问题描述】:

我正在尝试使用 Apache Commons JXPath 解析 XML。但由于某种原因,在解析 xml 后,它无法识别子节点。这是示例代码:

private static void processUrl(String seed){
    String test = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><feed xmlns=\"http://www.w3.org/2005/Atom\" xmlns:media=\"http://search.yahoo.com/mrss/\" xmlns:openSearch=\"http://a9.com/-/spec/opensearchrss/1.0/\" xmlns:gd=\"http://schemas.google.com/g/2005\" xmlns:yt=\"http://gdata.youtube.com/schemas/2007\"><id>http://gdata.youtube.com/feeds/api/videos</id><logo>http://www.youtube.com/img/pic_youtubelogo_123x63.gif</logo><link rel=\"alternate\" type=\"text/html\" href=\"http://www.youtube.com\"/><author><name>YouTube</name><uri>http://www.youtube.com/</uri></author><generator version=\"2.1\" uri=\"http://gdata.youtube.com\">YouTube data API</generator><openSearch:totalResults>144</openSearch:totalResults><entry><id>http://gdata.youtube.com/feeds/api/videos/P1lDDu9L5YQ</id><published>2010-09-20T17:41:38.000Z</published><updated>2011-09-18T22:15:38.000Z</updated><category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://gdata.youtube.com/schemas/2007#video\"/><link rel=\"alternate\" type=\"text/html\" href=\"http://www.youtube.com/watch?v=P1lDDu9L5YQ&amp;feature=youtube_gdata\"/></entry></feed>";
    Document doc = null;
    try{
        DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        ByteArrayInputStream bais = new ByteArrayInputStream(test.toString().getBytes("UTF8"));
        doc = builder.parse(bais);
        bais.close();

        JXPathContext ctx = JXPathContext.newContext(doc);
        List entryNodes = ctx.selectNodes("/feed/entry");
        System.out.println("number of threadNodes " + entryNodes.size());
        int totalThreads = 0;
        for (Object each : entryNodes) {
            totalThreads++;
            Node eachEntryNode = (Node) each;
            JXPathContext msgCtx = JXPathContext.newContext(eachEntryNode);
            String title = (String) msgCtx.getValue("title");
        }
    }catch (Exception ex) {
        ex.printStackTrace();
    }
}

我之前使用过 JXPath,从来没有遇到过任何问题。我调试了文档对象,它似乎没有子节点()。我能看到的只是根元素。我也尝试了 DOMParser,但没有任何运气。

DOMParser parser = new DOMParser();
        Document doc = (Document) parser.parseXML(new ByteArrayInputStream(sb0.toString().getBytes("UTF-8")));

如果有人可以提供有关此用法的指针,我将不胜感激。

【问题讨论】:

标签: xpath domparser jxpath


【解决方案1】:

这个问题与 JXPath 如何处理默认名称空间有关,这与XPath 1.0 规范密切相关。这也解释了为什么在您删除默认命名空间 http://www.w3.org/2005/Atom 后它会起作用。为了让它与默认命名空间一起工作,您可以执行以下操作:

JXPathContext ctx = JXPathContext.newContext(doc.getDocumentElement());
// Register the default namespace, giving it a prefix of your choice
ctx.registerNamespace("myfeed", "http://www.w3.org/2005/Atom");

// Now query for entry elements using the registered prefix
List entryNodes = ctx.selectNodes("myfeed:entry");

有关此问题的更多信息,请参阅以下链接。

http://markmail.org/message/7iqw4bjrkwerbh46

Make jxpath namespace aware

【讨论】:

  • 非常感谢,工作就像一个魅力。感谢文档的指针,对命名空间问题有了更好的理解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-25
  • 2014-08-30
  • 2011-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
相关资源
最近更新 更多