2011-04-06 83 views
9

當前我正在使用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關閉異常。

回答

11

將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