避免在Java中使用XPath重复实例化InputSource
问题描述:
当前我正在使用XPath Expression解析XML消息。它工作得很好。不过,我有以下问题:避免在Java中使用XPath重复实例化InputSource
我解析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关闭异常。
答
将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类。另外,你能帮我解答下面的帖子吗? http://stackoverflow.com/questions/33758074/extract-multiple-xpaths-using-single-inputsource-from-xpathexpression – developer 2015-11-17 14:36:02