目前我正在使用XPath Expression解析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关闭的例外情况。
答案 0 :(得分:12)
将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与不同的读取器实例一起使用。