【问题标题】:Retrieve value of XML node and node attribute using XPath in JAXP在 JAXP 中使用 XPath 检索 XML 节点和节点属性的值
【发布时间】:2011-05-30 07:16:36
【问题描述】:

给定一个如下所示的 xml 文档:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
    <entry key="agentType">STANDARD</entry>
    <entry key="DestinationTransferStates"></entry>
    <entry key="AgentStatusPublishRate">300</entry>
    <entry key="agentVersion">f000-703-GM2-20101109-1550</entry>
    <entry key="CommandTimeUTC">2010-12-24T02:25:43Z</entry>
    <entry key="PublishTimeUTC">2010-12-24T02:26:09Z</entry>
    <entry key="queueManager">AGENTQMGR</entry>
</properties>

我想打印“key”属性和元素的值,看起来像这样:

agentType = STANDARD
DestinationTransferStates = 
AgentStatusPublishRate = 300
agentVersion = f000-703-GM2-20101109-1550
CommandTimeUTC = 2010-12-24T02:25:43Z
PublishTimeUTC = 2010-12-24T02:26:09Z
queueManager = AGENTQMGR

我可以使用此代码毫无问题地打印节点值:

XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expr = xpath.compile("//properties/entry/text()");

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).getNodeValue()); 
}

我可以通过改变 xpath 表达式和节点方法来打印“key”属性的值,如下所示:

XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expr = xpath.compile("//properties/entry");
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).getAttributes().getNamedItem("key").getNodeValue()); 
}

似乎有一种方法可以在单个evaluate 中同时获取这两个值。我总是可以评估两个 NodeList 并使用公共索引遍历它们,但我不确定它们是否保证以相同的顺序返回。任何建议表示赞赏。

【问题讨论】:

  • 好像jaxp的xml代码比较乱,有没有开放其他类型的xml api?
  • 一旦我得到了 JAXP 代码,我就用 XSLT 编写了它。这更干净(看起来像带有一些添加标记的 HTML),但需要永远呈现。接下来我将尝试使用带有 translet 的 XSLT。其他建议绝对欢迎。

标签: java xml xpath jaxp


【解决方案1】:

getTextContent() 呢?这应该可以完成工作。

Object result = expr.evaluate(doc, XPathConstants.NODESET);
NodeList nodes = (NodeList) result;
for (int i = 0; i < nodes.getLength(); i++)
{
    Node currentItem = nodes.item(i);
    String key = currentItem.getAttributes().getNamedItem("key").getNodeValue();
    String value = currentItem.getTextContent();

    System.out.printf("%1s = %2s\n", key, value);
}

有关更多信息,请参阅getTextContent() 的 javadoc。我希望这会对你有所帮助。

【讨论】:

  • 复制、粘贴,完美运行。谢谢!我会仔细看看 getTextContent()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
相关资源
最近更新 更多