2011-09-12 5 views
9

मुझे जावा में कुछ एक्सएमएल पार्स करने में थोड़ा परेशानी हो रही है। मेरी एक्सएमएल फ़ाइल सही ढंग से पढ़ी जाती है और मैं नोड्स 'getTextContent() फ़ंक्शन का उपयोग करके फ़ाइल से अधिकतर जानकारी प्राप्त करने में सक्षम हूं (यानी स्ट्रीमटाइप नोड, एक्सएमएल स्निपेट में दिखाया गया है)।जावा में xml पार्सिंग - getTextContent() और getNodeValue() केवल वापसी n, t, और व्हाइटस्पेस

लेकिन, जब मैं किसी नोड के बच्चों के साथ काम करने का प्रयास करता हूं, तो दोनों getNodeValue() और getTextContent() को यह यादृच्छिक मान वापस लौटाते हैं: "\ n \ t \ t"।

नोडलिस्ट संपत्ति नोड्स सही ढंग से आबादी लगती है (सभी 18 "संपत्ति" तत्व शामिल हैं)। मैं गलत यहाँ क्या कर रहा हो सकता है

<Root> 
<Application> 
    <Streams> 
    <StreamType>live</StreamType> 
    ... 
    </Streams> 

    ... 

    <Properties> 

    ... 

    <Property> 
    <Name>maxConnections</Name> 
    <Value>1000</Value> 
    </Property> 

    ... 

    </Properties> 
</Application> 
</Root> 

किसी भी विचार:

यहाँ मेरी कोड से एक टुकड़ा है:

Document document; 
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder builder = factory.newDocumentBuilder(); 
document = builder.parse(appXML); 

... 

String typeName = document.getElementsByTagName("StreamType").item(0).getTextContent(); 

... 

String limit = "-1"; 
NodeList propertyNodes = document.getElementsByTagName("Property"); 
int nodelistlength = propertyNodes.getLength(); 
for (int i = 0; i < nodelistlength; i++) { 
    Node currentNode = propertyNodes.item(i); 
    Node nameNode = currentNode.getFirstChild(); 
    Node valueNode = currentNode.getLastChild(); 

    String name = nameNode.getNodeValue(); 
    String value = valueNode.getNodeValue(); 

    if (nameNode.getTextContent().equalsIgnoreCase("maxConnections")) 
     limit = valueNode.getTextContent(); 
} 

और यहाँ है एक्सएमएल से कुछ snips मैं पार्स करने के लिए कोशिश कर रहा हूँ? बहुत बहुत धन्यवाद!

संपादित करें: अब काम करता है, @home द्वारा पोस्ट किए गए ट्यूटोरियल के लिए धन्यवाद।

1) "स्ट्रिंग सीमा" के साथ शुरू और पाश के अंत ब्रैकेट के लिए के साथ समाप्त कोड के ब्लॉक संशोधित::

String limit = "-1"; 
NodeList propertyNodes = document.getElementsByTagName("Property"); 
for (int i = 0; i < propertyNodes.getLength(); i++) { 
    Node currentNode = propertyNodes.item(i); 

    if (currentNode.getNodeType() != Node.ELEMENT_NODE) 
     continue; 

    Element currentElement = (Element)currentNode; 

    if (getTagValue("Name",currentElement).equalsIgnoreCase("maxConnections")) 
     limit = getTagValue("Value",currentElement); 
} 

2) से इस काम समारोह जोड़ा गया यह मैं कैसे कोड तय है ट्यूटोरियल:

private static String getTagValue(String sTag, Element eElement) { 
    NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes(); 
    Node nValue = (Node) nlList.item(0); 
    return nValue.getNodeValue(); 
} 

यह अब "गुण" तत्व के बच्चे का नाम/मूल्य जोड़े लाता है। बहुत बहुत धन्यवाद!

+0

कोई कारण नहीं है कि आप JAXB का उपयोग नहीं कर सकते? – ChadNC

+1

@ होम, आपके ट्यूटोरियल ने मेरी समस्या हल की और अब मेरा कोड काम करता है! क्या आप इसे उत्तर के रूप में पोस्ट कर सकते हैं ताकि मैं इसे "सर्वश्रेष्ठ" के रूप में चिह्नित कर सकूं और इसे अपवर्तित कर सकूं? बहुत बहुत धन्यवाद! :) –

+0

@ कैथरीन विलियम्स: जोड़ा गया उत्तर :-) – home

उत्तर

7

अफसोस की बात है, जावा डोम का उपयोग करना इतना आसान नहीं है। आपको विभिन्न नोड प्रकारों के बीच अंतर करना चाहिए। सबसे अच्छा ट्यूटोरियल नहीं है, लेकिन यह है कि मैंने अभी Google का उपयोग किया है: http://mkyong.com/java/how-to-read-xml-file-in-java-dom-parser

+0

धन्यवाद! यही वही था जो मुझे चाहिए था। क्षमा करें मैं भी ऊपर नहीं जा सका, लेकिन इसके लिए 15 प्रतिनिधि की आवश्यकता है। –

2

यह नोड के मूल्य की सही सामग्री है।

<a> 
    <b> 
     stuff 
    </b> 
</a> 

a नोड (जो इस मामले में पाठ्य सामग्री के बराबर होती है) सही ढंग से आरंभ और समाप्ति टैग के बीच खाली स्थान के से मिलकर करता है, b टैग में निश्चित रूप से व्हाइटस्पेस को छोड़ते हुए का मूल्य क्योंकि कि, अच्छी तरह से , b टैग से संबंधित है और a पर नहीं है।

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