避免在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用于不同的阅读器实例。

+0

请您详细说明一下“这样可以避免多次解析字符串”。 ?我不明白,你的解决方案也不使用XPathExpression类。另外,你能帮我解答下面的帖子吗? http://stackoverflow.com/questions/33758074/extract-multiple-xpaths-using-single-inputsource-from-xpathexpression – developer 2015-11-17 14:36:02