避免在 Java 中使用 XPath 重复实例化 InputSource

Posted

技术标签:

【中文标题】避免在 Java 中使用 XPath 重复实例化 InputSource【英文标题】:Avoid repeated instantiation of InputSource with XPath in Java 【发布时间】:2011-07-30 22:04:27 【问题描述】:

目前我正在使用 XPath 表达式解析 XML 消息。它工作得很好。但是我有以下问题:

我正在解析 XML 的全部数据,因此我为每次调用 xPath.evaulate 实例化一个新的 InputSource

StringReader xmlReader = new StringReader(xml);
InputSource source = new InputSource(xmlReader);
XPathExpression xpe = xpath.compile("msg/element/@attribute");
String attribute = (String) xpe.evaluate(source, XPathConstants.STRING);

现在我想深入了解我的 XML 消息并评估更多信息。为此,我发现自己需要再次实例化源。这是必需的吗?如果我不这样做,我会收到 Stream closed Exceptions。

【问题讨论】:

【参考方案1】:

将 XML 解析为 DOM 并保留对节点的引用。示例:

XPath xpath = XPathFactory.newInstance()
    .newXPath();
InputSource xml = new InputSource(new StringReader("<xml foo='bar' />"));
Node root = (Node) xpath.evaluate("/", xml, XPathConstants.NODE);
System.out.println(xpath.evaluate("/xml/@foo", root));

这样可以避免多次解析字符串。

如果您必须将InputSource 重用于不同的XML 字符串,您可以将setters 与不同的阅读器实例一起使用。

【讨论】:

您能否详细说明“这可以避免多次解析字符串”。 ?我不明白,您的解决方案也不使用 XPathExpression 类。另外,你能帮我回答下面的帖子吗? ***.com/questions/33758074/…

以上是关于避免在 Java 中使用 XPath 重复实例化 InputSource的主要内容,如果未能解决你的问题,请参考以下文章

在Java中实例化一个泛型类[重复]

在Java中获取参数化类的实例[重复]

xpath库学习

Effective Java

在 Java 中使用 XPath 解析 XML [重复]

java怎么实现单实例运行