使用Java XPath解析XML简单字符串

我有这样的XML字符串

<resp><status>good</status><msg>hi</msg></resp>

我遵循此帮助

Java查询XML的最简单方法

我的代码:

public static void main(String args[]) {

String xml = "<resp><status>good</status><msg>hi</msg></resp>";

XPathFactory xpathFactory = XPathFactory.newInstance();

XPath xpath = xpathFactory.newXPath();

InputSource source = new InputSource(new StringReader(xml));

String status = "";

String msg = "";

try {

status = (String) xpath.evaluate("/resp/status", source,XPathConstants.STRING);

msg = (String) xpath.evaluate("/resp/msg", source,XPathConstants.STRING);

} catch (Exception e) {

e.printStackTrace();

}

System.out.println("status=" + status);

System.out.println("Message=" + msg);

}

我想获取味精节点值,但出现异常

java.io.IOException: Stream closed

at java.io.StringReader.ensureOpen(StringReader.java:39)

at java.io.StringReader.read(StringReader.java:73)

at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1742)

at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.arrangeCapacity(XMLEntityScanner.java:1619)

at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.skipString(XMLEntityScanner.java:1657)

at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:193)

at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:771)

at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)

at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107)

at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:225)

at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:283)

at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.evaluate(XPathImpl.java:468)

at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.evaluate(XPathImpl.java:515)

at Parsing.main(Parsing.java:25)--------------- linked to ------------------

javax.xml.xpath.XPathExpressionException

at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.evaluate(XPathImpl.java:475)

at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.evaluate(XPathImpl.java:515)

at Parsing.main(Parsing.java:25)

Caused by: java.io.IOException: Stream closed

at java.io.StringReader.ensureOpen(StringReader.java:39)

at java.io.StringReader.read(StringReader.java:73)

at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1742)

at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.arrangeCapacity(XMLEntityScanner.java:1619)

at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.skipString(XMLEntityScanner.java:1657)

at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:193)

at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:771)

at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)

at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107)

at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:225)

at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:283)

at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.evaluate(XPathImpl.java:468)

... 2 more

我不会为这个简单的任务使用一些外部库。请指导我如何获取其他节点的值。谢谢

回答:

您不能将其重复InputSource用于多个evaluate()调用,因为它会自动关闭。因此,您将获得Stream

closedIO异常。试试这个

InputSource source1 = new InputSource(new StringReader(xml));

InputSource source2 = new InputSource(new StringReader(xml));

String msg = xpath.evaluate("/resp/msg", source);

String status = xpath.evaluate("/resp/status", source2);

System.out.println("msg=" + msg + ";" + "status=" + status);

更好的方法是使用ADocumentBuilderFactory解析您的XML并构建Document第一个(使用JAXP的DOM

API),然后可以在多个XPath评估中重复使用。

String xml = "<resp><status>good</status><msg>hi</msg></resp>";

InputSource source = new InputSource(new StringReader(xml));

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

DocumentBuilder db = dbf.newDocumentBuilder();

Document document = db.parse(source);

XPathFactory xpathFactory = XPathFactory.newInstance();

XPath xpath = xpathFactory.newXPath();

String msg = xpath.evaluate("/resp/msg", document);

String status = xpath.evaluate("/resp/status", document);

System.out.println("msg=" + msg + ";" + "status=" + status);

以上是 使用Java XPath解析XML简单字符串 的全部内容, 来源链接: utcz.com/qa/423618.html

回到顶部