2013-05-23 6 views
29

का उपयोग कर स्ट्रिंग मैं इसXML पार्स सरल जावा XPath

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

मैं इस मदद का पालन करें की तरह एक्सएमएल स्ट्रिंग है

Simplest way to query XML in Java

MyCode:

मैं प्राप्त करना चाहते हैं संदेश नोड मान लेकिन मुझे अपवाद मिला

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 

मैं इस सरल कार्य के लिए कुछ बाहरी पुस्तकालय का उपयोग नहीं करने जा रहा हूं। कृपया मुझे मार्गदर्शन करें कि अन्य नोड के मूल्य कैसे प्राप्त करें। धन्यवाद

+0

पोस्ट आपके सभी विधि यदि आप मदद चाहते हैं .. –

+0

कोड की केवल एक पंक्ति साझा करके ज्यादा सहायता प्राप्त करने की अपेक्षा न करें। –

उत्तर

38

आप InputSource को evaluate() आमंत्रणों के लिए पुन: उपयोग नहीं कर सकते क्योंकि यह स्वचालित रूप से बंद हो जाता है। इसलिए आपको Stream closed आईओ अपवाद मिल रहा है। इस

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); 

संपादित करें का प्रयास करें:
एक बेहतर दृष्टिकोण आपके XML पार्स करने के लिए एक DocumentBuilderFactory का उपयोग करें और निर्माण करने के लिए किया जाएगा एक Document पहले (का उपयोग कर JAXP के डोम एपीआई) जो तब कई XPath मूल्यांकन भर में पुन: उपयोग किया जा सकता है ।

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)); 
Document doc = (Document) xpath.evaluate("/", source, XPathConstants.NODE); 
String status = xpath.evaluate("/resp/status", doc); 
String msg = xpath.evaluate("/resp/msg", doc); 

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

तो अगर मेरे पास कई नोड्स हैं तो मुझे उनमें से प्रत्येक के लिए स्रोत बनाना होगा? क्या कोई बेहतर समाधान है? –

+0

'दस्तावेज़' (जेएक्सपी डोम एपीआई का हिस्सा) बनाने के लिए 'दस्तावेज़बिल्डर फ़ैक्टरी' का उपयोग करें जिसे एकाधिक एक्सपैथ मूल्यांकनों में पुन: उपयोग किया जा सकता है। –

+0

अद्यतन की जांच करें। शुरू करने में आपकी सहायता के लिए कुछ कोड जोड़ा गया। –

11

Ravi's solution भी रूप में व्यक्त किया जा सकता

import com.jcabi.xml.XML; 
import com.jcabi.xml.XMLDocument; 
XML xml = new XMLDocument("<resp>...</resp>"); 
String status = xml.xpath("/resp/status/text()").get(0); 
+2

ब्याज से बाहर, यदि XML स्ट्रिंग अच्छा था, ठीक है क्या कॉमा से पहले स्ट्रिंग में पहले शब्द का चयन करना है? या सिर्फ अल्पविराम के बाद शब्द का चयन? –

+0

@brookman जावा के XPath समर्थन के साथ नहीं। आप XPath 2 के साथ सक्षम हो सकते हैं - सैक्सन एपीआई देखें। – McDowell

6

आप jcabi-xml कोशिश कर सकते हैं, जो दृश्य के पीछे डोम जोड़तोड़ करता है::

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); 
+0

यह लाइब्रेरी बहुत अच्छी है, लेकिन मुझे यह पसंद नहीं है कि यह इसके साथ पहलू लाता है - जो मुझे नहीं लगता कि वास्तव में आवश्यक है –

+0

हाँ, हम बहुत जल्द – yegor256

+0

से छुटकारा पाने की योजना बना रहे हैं जो बहुत होगा अच्छा! कोई भी आरएसएस मैं खुद को अद्यतित रखने के लिए सदस्यता ले सकता हूं? –

संबंधित मुद्दे