从Wordpress feed解析Java中的XML

时间:2011-10-05 22:49:38

标签: java xml parsing

private void parseXml(String urlPath) throws Exception {
    URL url = new URL(urlPath);
    URLConnection connection = url.openConnection();
    DocumentBuilder db = DOCUMENT_BUILDER_FACTORY.newDocumentBuilder();

    final Document document = db.parse(connection.getInputStream());
    XPath xPathEvaluator = XPATH_FACTORY.newXPath();
    XPathExpression nameExpr = xPathEvaluator.compile("rss/channel/item/title");
    NodeList trackNameNodes = (NodeList) nameExpr.evaluate(document, XPathConstants.NODESET);
    for (int i = 0; i < trackNameNodes.getLength(); i++) {
        Node trackNameNode = trackNameNodes.item(i);
            System.out.println(String.format("Blog Entry Title: %s" , trackNameNode.getTextContent()));
        XPathExpression artistNameExpr = xPathEvaluator.compile("rss/channel/item/content:encoded");
        NodeList artistNameNodes = (NodeList) artistNameExpr.evaluate(trackNameNode, XPathConstants.NODESET);
        for (int j=0; j < artistNameNodes.getLength(); j++) {
            System.out.println(String.format(" - Artist Name: %s", artistNameNodes.item(j).getTextContent()));
        }
    }
}

我有这个代码用于解析默认wordpress xml中的标题和内容,唯一的问题是,当我尝试获取博客条目的内容时,xml标记是:<content:encoded>而我不知道了解如何检索此数据?

2 个答案:

答案 0 :(得分:1)

标记<content:encoded>表示XML名称空间中名称为encoded且前缀为content的元素。 XPath评估程序可能无法解析它的命名空间的content前缀,我认为这是http://purl.org/rss/1.0/modules/content/来自快速的Google。

要解决此问题,您需要执行以下操作:

  1. 确保您的DocumentBuilderFactory在构建后调用setNamespaceAware( true ),否则在解析期间会丢弃所有名称空间。
  2. 编写javax.xml.namespace.NamespaceContext的实现以解析其命名空间(doc)的前缀。
  3. 使用您的实施方式致电XPath#setNamespaceContext()

答案 1 :(得分:0)

您也可以尝试使用XStream,这是一个优秀且易于使用的XML解析器。使您几乎不需要解析已知的XML结构。

PS:他们的网站目前处于离线状态,请使用Google缓存查看= P