如何在Java中使用XPath获取节点值

8

我有一个XML部分,看起来像这样:

<entry>
<id>tag:example.com,2005:Release/343597</id>
<published>2012-04-10T11:29:19Z</published>
<updated>2012-04-10T12:04:41Z</updated>
<link type="text/html" href="http://example.com/projects/example1" rel="alternate"/>
<title>example1</title>
</entry>

我需要从这个块中抓取链接http://example.com/projects/example1。我不确定如何实现。我使用以下代码来获取项目的标题:

String title1 = children.item(9).getFirstChild().getNodeValue();

这里的children<entry> </entry>块的getChildNodes()对象。但是,在类似的方式中尝试获取<link>节点值时,我一直收到NullPointerExceptions。我发现<link>节点的XML代码不同,我不确定它的值是什么...请给予建议!


你需要XPath语法吗?还是你需要Java API语法? - Joseph Victor Zammit
1
啊,好问题,正在寻找Java API语法。但我已经搞定了,见下文。谢谢。 - blaughli
2个回答

15
获取该节点的XPath表达式为:
//entry/link/@href

在Java中你可以这样写

Document doc = ... // your XML document
XPathExpression xp = XPathFactory.newInstance().newXPath().compile("//entry/link/@href");
String href = xp.evaluate(doc);

然后,如果你需要获取具有特定id的条目的link值,你可以将xpath表达式更改为:

//entry[id='tag:example.com,2005:Release/343597']/link/@href

最后,如果您想获取文档中的所有链接,如果文档有多个入口元素,则可以编写以下代码:

Document doc = ... // your XML document
XPathExpression xp = XPathFactory.newInstance().newXPath().compile("//entry/link/@href");
NodeList links = (NodeList) xp.evaluate(doc, XPathConstants.NODESET);
// and iterate on links

1
谢谢dash1e,你让我朝着正确的方向前进。使用你提供的语法,我能够评估编译后的Xpath表达式(将结果作为“NODESET”返回)。然后,我从结果(“NODESET”)中创建了一个NodeList,接着用while循环迭代获取我正在阅读的RSS页面上的所有链接。非常感谢你 :)。 - blaughli
我也补充一下 NodeList 的例子,以便完整。 - dash1e

6

这是完整代码:

    DocumentBuilderFactory domFactory = DocumentBuilderFactory
            .newInstance();
    domFactory.setNamespaceAware(true);
    DocumentBuilder builder = domFactory.newDocumentBuilder();
    Document doc = builder.parse("test.xml");
    XPath xpath = XPathFactory.newInstance().newXPath();
    XPathExpression expr = xpath.compile("//entry/link/@href");
    Object result = expr.evaluate(doc, XPathConstants.NODESET);
    NodeList nodes = (NodeList) result;
    for (int i = 0; i < nodes.getLength(); i++) {
         System.out.println(nodes.item(i));
    }

谢谢Phani,这正是我所做的。 - blaughli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接