2013-04-02 15 views
9

Wiem, że to pytanie było wiele razy, ale nadal nie mogę go uruchomić. Zamieniam ciąg xml na obiekt Document, a następnie analizuję go. Oto kod:java xml obsada Węzeł do elementu

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

Kiedy oddania obiektu do węzła N Element dostaję java.lang.ClassCastException wyjątku: org.apache.harmony.xml.dom.TextImpl nie może być oddane do org.w3c. dom.Element. Kiedy sprawdzam typ węzła obiektu Node, pojawia się Node.TEXT_NODE. Uważam, że powinien to być Node.ELEMENT_NODE. Czy mam rację?

W jaki sposób mogę przekonwertować węzeł na element, więc mogę zrobić coś jak element.getAttribute ("attrName").

Tu jest mój XML:

<?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> 

Z góry dzięki!

+2

W jaki sposób mamy wiedzieć, czy pierwszy węzeł powinien być elementem lub tekstem, pokaż n nas dokument? Podejrzewam, że parser ma rację ... Podejrzewam, że prawdopodobnie po prostu chcesz pominąć węzły inne niż element. –

+0

Dodałem xml. Węzeł powinien być elementem, a nie tekstem. Mam rację? – Student

+1

Tak, ale myślę, że znajdziesz element tekstowy (prawdopodobnie tylko linię podziału) pomiędzy '' i '' - oraz między każdym '' i ''. –

Odpowiedz

6

Kiedy oddania obiektu do węzła N Element dostaję java.lang.ClassCastException wyjątku: org.apache.harmony.xml.dom.TextImpl nie może być oddane do org.w3c.dom.Element. Kiedy sprawdzam typ węzła obiektu Node, pojawia się Node.TEXT_NODE. Uważam, że powinien to być Node.ELEMENT_NODE. Czy mam rację?

Prawdopodobnie nie, parser prawdopodobnie ma rację. Oznacza to, że niektóre z węzłów, które analizujesz, to: text nodes. Na przykład:

<foo>bar</foo> 

w powyższym mamy foo elementu zawierającego węzeł tekstowy. (. Węzeł tekst zawiera tekst "bar")

Podobnie rozważenia:

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

Jeśli dokument XML dosłownie wygląda jak powyżej, zawiera element główny foo z tych węzłów potomnych (w kolejności)

  • węzeł tekst pewnym odstępami w nim
  • A bar elementu
  • Węzeł tekst z jakiegoś bardziej spacji w nim

Należy zauważyć, że element bar nie jest pierwszym dzieckiem foo. Jeśli to wyglądało tak:

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

następnie element bar byłby pierwszym dzieckiem foo.

17

myślę, że trzeba coś takiego:

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

można także spróbować „chronić” Twój odlewania

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

ale jak wskazano przez innych, masz węzeł tekstowy, ci won” t być odlane za pomocą tej metody, upewnij się, że nie potrzebujesz ich użyć warunku, aby mieć inny kod do ich przetwarzania.

Powiązane problemy