दिलचस्प पोस्ट
विंडोज फोन में पृष्ठभूमि में आवेदन कैसे चलाना है? एंड्रॉइड कॉलम '_id' मौजूद नहीं है? TransactionScope लेनदेन वापस रोल कैसे करता है? जावा में सभ्य दिखने वाले मंडल को कैसे आकर्षित किया जाए पायथन में दो एन-आयामी वैक्टर के बीच के कोण स्ट्रिंग से जेसन ऑब्जेक्ट एंड्रॉइड तक रूपांतरण पावरशेल्ड के साथ शॉर्टकट (.lnk) गुणों को संपादित करना एकाधिक परियोजनाओं के साथ सर्वर के लिए जीआईटी भंडार लेआउट क्यों angularjs समारोह `नाम ()` दो बार आह्वान करेगा? आईओएस सफारी में उत्तरदायी होने के लिए आइफ्रेम कैसे प्राप्त करें? मैं JQuery.noConflict कैसे कार्यान्वित करूं? कैसे vba मैक्रो में खाली सरणी के लिए जाँच करें नोडजेएस के अंडे का उपयोग "अज्ञात विकल्प -" और "" त्रुटियों का कारण बनता है NSTimer टाइमरविथटाइम टाइम: काम नहीं कर रहा है बहिष्कृत एसवीजी पथ एसईजीएलआईस्ट के लिए वैकल्पिक

जावा डोम के साथ XML नोड पाठ मान प्राप्त करना

मैं Node.getNodeValue() , Node.getFirstChild().getNodeValue() साथ या Node.getNodeValue() साथ पाठ मान नहीं Node.getTextContent()

मेरा XML समान है

 <add job="351"> <tag>foobar</tag> <tag>foobar2</tag> </add> 

और मैं टैग मान प्राप्त करने की कोशिश कर रहा हूं (गैर-पाठ तत्व काम करने का काम ठीक है)। मेरे जावा कोड की तरह लगता है

 Document doc = db.parse(new File(args[0])); Node n = doc.getFirstChild(); NodeList nl = n.getChildNodes(); Node an,an2; for (int i=0; i < nl.getLength(); i++) { an = nl.item(i); if(an.getNodeType()==Node.ELEMENT_NODE) { NodeList nl2 = an.getChildNodes(); for(int i2=0; i2<nl2.getLength(); i2++) { an2 = nl2.item(i2); // DEBUG PRINTS System.out.println(an2.getNodeName() + ": type (" + an2.getNodeType() + "):"); if(an2.hasChildNodes()) System.out.println(an2.getFirstChild().getTextContent()); if(an2.hasChildNodes()) System.out.println(an2.getFirstChild().getNodeValue()); System.out.println(an2.getTextContent()); System.out.println(an2.getNodeValue()); } } } 

यह प्रिंट करता है

 tag type (1): tag1 tag1 tag1 null #text type (3): _blank line_ _blank line_ ... 

सहायता के लिए धन्यवाद।

Solutions Collecting From Web of "जावा डोम के साथ XML नोड पाठ मान प्राप्त करना"

मैं an2.getNodeName() के परिणाम को भी डिबगिंग प्रयोजनों के लिए प्रिंट करना an2.getNodeName() मेरा अनुमान है कि आपका पेड़ क्रॉलिंग कोड नोड्स को रेंगते नहीं है जो आपको लगता है कि यह है। आपके कोड में नोड नामों की जांच करने की कमी के कारण यह संदेह बढ़ाया गया है।

इसके अलावा, नोड के लिए javadoc " getNodeValue ()" को परिभाषित करता है ताकि टाइप एलिमेंट के नोड्स के लिए रिक्त हो। इसलिए, आपको वास्तव में getTextContent () का उपयोग करना चाहिए मुझे यकीन नहीं है कि वह आपको वह पाठ क्यों नहीं दे जो आप चाहते हैं

शायद आपके टैग नोड के बच्चों को पुनरावृत्त करें और देखें कि क्या प्रकार हैं?

इस कोड की कोशिश की और यह मेरे लिए काम करता है:

 String xml = "<add job=\"351\">\n" + " <tag>foobar</tag>\n" + " <tag>foobar2</tag>\n" + "</add>"; DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); ByteArrayInputStream bis = new ByteArrayInputStream(xml.getBytes()); Document doc = db.parse(bis); Node n = doc.getFirstChild(); NodeList nl = n.getChildNodes(); Node an,an2; for (int i=0; i < nl.getLength(); i++) { an = nl.item(i); if(an.getNodeType()==Node.ELEMENT_NODE) { NodeList nl2 = an.getChildNodes(); for(int i2=0; i2<nl2.getLength(); i2++) { an2 = nl2.item(i2); // DEBUG PRINTS System.out.println(an2.getNodeName() + ": type (" + an2.getNodeType() + "):"); if(an2.hasChildNodes()) System.out.println(an2.getFirstChild().getTextContent()); if(an2.hasChildNodes()) System.out.println(an2.getFirstChild().getNodeValue()); System.out.println(an2.getTextContent()); System.out.println(an2.getNodeValue()); } } } 

आउटपुट था:

 #text: type (3): foobar foobar #text: type (3): foobar2 foobar2 

यदि आपका XML काफी गहरा होता है, तो आप XPath का उपयोग करने पर विचार करना चाह सकते हैं, जो आपके जेआरई के साथ आता है, ताकि आप सामग्री का उपयोग करके अधिक आसानी से उपयोग कर सकें:

 String text = xp.evaluate("//add[@job='351']/tag[position()=1]/text()", document.getDocumentElement()); 

पूर्ण उदाहरण:

 import static org.junit.Assert.assertEquals; import java.io.StringReader; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathFactory; import org.junit.Before; import org.junit.Test; import org.w3c.dom.Document; import org.xml.sax.InputSource; public class XPathTest { private Document document; @Before public void setup() throws Exception { String xml = "<add job=\"351\"><tag>foobar</tag><tag>foobar2</tag></add>"; DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); document = db.parse(new InputSource(new StringReader(xml))); } @Test public void testXPath() throws Exception { XPathFactory xpf = XPathFactory.newInstance(); XPath xp = xpf.newXPath(); String text = xp.evaluate("//add[@job='351']/tag[position()=1]/text()", document.getDocumentElement()); assertEquals("foobar", text); } } 

मैं बहुत पुराने जावा का उपयोग करता हूँ Jdk 1.4.08 और मेरे पास एक ही समस्या थी मेरे लिए Node वर्ग में getTextContent() विधि नहीं थी नोड के मूल्य को प्राप्त करने के लिए मुझे नोड Node.getFirstChild().getNodeValue() बजाय Node.getNodeValue() का उपयोग करना था। यह मेरे लिए तय है

यदि आप vtd-xml के लिए खुले हैं, जो दोनों प्रदर्शन और स्मृति दक्षता में उत्कृष्टता देता है, नीचे कोड है जो आप के लिए देख रहे हैं … दोनों XPath और मैनुअल नेविगेशन … समग्र कोड बहुत संक्षिप्त और आसान है समझना …

 import com.ximpleware.*; public class queryText { public static void main(String[] s) throws VTDException{ VTDGen vg = new VTDGen(); if (!vg.parseFile("input.xml", true)) return; VTDNav vn = vg.getNav(); AutoPilot ap = new AutoPilot(vn); // first manually navigate if(vn.toElement(VTDNav.FC,"tag")){ int i= vn.getText(); if (i!=-1){ System.out.println("text ===>"+vn.toString(i)); } if (vn.toElement(VTDNav.NS,"tag")){ i=vn.getText(); System.out.println("text ===>"+vn.toString(i)); } } // second version use XPath ap.selectXPath("/add/tag/text()"); int i=0; while((i=ap.evalXPath())!= -1){ System.out.println("text node ====>"+vn.toString(i)); } } }