2013-04-02 6 views
9

मुझे पता है कि यह कई बार पूछा गया था लेकिन मैं अभी भी इसे काम नहीं कर सकता। मैं एक्सएमएल स्ट्रिंग को दस्तावेज़ ऑब्जेक्ट में कनवर्ट करता हूं और फिर इसे पार्स करता हूं।जावा एक्सएमएल कास्ट नोड टू एलिमेंट

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import org.w3c.dom.*; 

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder builder; 
try 
{ 
    builder = factory.newDocumentBuilder(); 
    Document document = builder.parse(new InputSource(new StringReader(result))); 
    Node head = document.getFirstChild(); 
    if(head != null) 
    {     
    NodeList airportList = head.getChildNodes();  
    for(int i=0; i<airportList.getLength(); i++) { 
    Node n = airportList.item(i);       
    Element airportElem = (Element)n; 
    } 
} 
catch (Exception e) { 
    e.printStackTrace(); 
} 

जब मैं तत्व को नोड वस्तु n डाली मैं एक अपवाद java.lang.ClassCastException मिलती है:: यहाँ कोड है org.apache.harmony.xml.dom.TextImpl org.w3c में ढाला नहीं जा सकता है। dom.Element। जब मैं नोड ऑब्जेक्ट के नोड प्रकार की जांच करता हूं तो यह Node.TEXT_NODE कहता है। मेरा मानना ​​है कि यह नोड होना चाहिए। ELEMENT_NODE। क्या मैं सही हू?

तो मैं नोड को एलिमेंट में कैसे परिवर्तित करूं, इसलिए मैं element.getAttribute ("attrName") जैसी कुछ कर सकता हूं।

<?xml version="1.0" encoding="utf-8" ?> 
<ArrayOfCity xmlns:xsd="http://www.w3.org/2001/XMLSchema"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > 
<City> 
    <strName>Abu Dhabi</strName> 
    <strCode>AUH</strCode> 
</City> 
<City> 
    <strName>Amsterdam</strName> 
    <strCode>AMS</strCode> 
</City> 
<City> 
    <strName>Antalya</strName> 
    <strCode>AYT</strCode> 
</City> 
<City> 
    <strName>Bangkok</strName> 
    <strCode>BKK</strCode> 
</City> 
</ArrayOfCity> 

अग्रिम धन्यवाद:

यहाँ मेरी एक्सएमएल है!

+2

प्रक्रिया करने के लिए एक अलग कोड रखने की शर्त की आवश्यकता नहीं है, हम कैसे जान सकते हैं कि पहला नोड तत्व या पाठ होना चाहिए, जब आप हेवन करते हैं शो नहीं एन हमें दस्तावेज? मुझे दृढ़ता से संदेह है कि पार्सर सही है हालांकि ... मुझे संदेह है कि आप शायद गैर-तत्व नोड्स को छोड़ना चाहते हैं। –

+0

मैंने एक्सएमएल जोड़ा है। नोड एक तत्व होना चाहिए, एक पाठ नहीं। क्या मैं सही हूँ? – Student

+1

हां, लेकिन मुझे लगता है कि आपको '' और '' और '' और '' के बीच एक टेक्स्ट तत्व (संभवतः केवल एक लाइन ब्रेक) मिलेगा। –

उत्तर

6

जब मैं तत्व को नोड वस्तु n डाली मैं एक अपवाद java.lang.ClassCastException मिलती है: org.apache.harmony.xml.dom.TextImpl org.w3c.dom.Element में ढाला नहीं जा सकता है। जब मैं नोड ऑब्जेक्ट के नोड प्रकार की जांच करता हूं तो यह Node.TEXT_NODE कहता है। मेरा मानना ​​है कि यह नोड होना चाहिए। ELEMENT_NODE। क्या मैं सही हू?

शायद नहीं, पार्सर शायद सही है। इसका मतलब है कि आप जो पार्सिंग कर रहे हैं उनमें से कुछ नोड text nodes हैं। उदाहरण के लिए:

<foo>bar</foo> 

ऊपर में, हम एक पाठ नोड युक्त एक foo तत्व है। इसी तरह

(। पाठ नोड पाठ "bar" शामिल हैं), पर विचार करें:

अपने XML दस्तावेज़ सचमुच ऊपर की तरह लग रहा
<foo> 
    <bar>baz</bar> 
</foo> 

है, यह एक मूल तत्व foo इन बच्चे नोड्स के साथ (क्रम में शामिल):

  • यह
  • एक bar तत्व
  • में कुछ सफेद स्थान के साथ एक पाठ नोड
  • में यह

ध्यान दें कि bar तत्व foo का पहला बच्चा नहीं है कुछ और सफेद स्थान के साथ एक पाठ नोड। यदि यह इस तरह देखा:

<foo><bar>baz</bar></foo> 

तोbar तत्व foo का पहला बच्चा होगा।

17

मैं तुम्हें कुछ इस तरह की जरूरत है:

NodeList airportList = head.getChildNodes(); 
for (int i = 0; i < airportList.getLength(); i++) { 
    Node n = airportList.item(i); 
    if (n.getNodeType() == Node.ELEMENT_NODE) { 
     Element elem = (Element) n; 
    } 
} 
4

आप भी अपने कास्टिंग "रक्षा" के लिए

Node n = airportList.item(i); 
if (n instanceof Element) 
{       
    Element airportElem = (Element)n; 
    // ... 
} 

लेकिन जैसा कि दूसरों के द्वारा कहा, आप पाठ नोड है, उन जीता 'कोशिश कर सकते हैं इस विधि से नहीं डाला जा सकता है, सुनिश्चित करें कि आपको उन्हें

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