2013-04-02 2 views
9

나는 이것이 여러 번 요청되었지만 여전히 작동시키지 못한다는 것을 알고있다. XML 문자열을 Document 객체로 변환 한 다음 파싱합니다. 내가 요소로 노드 객체 N 캐스트java xml 캐스트 노드에서 노드

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

내가 예외 java.lang.ClassCastException가 얻을 : 여기에 코드입니다 org.apache.harmony.xml.dom.TextImpl이 org.w3c에 캐스트 할 수 없습니다. dom.Element. Node 객체의 노드 유형을 확인하면 Node.TEXT_NODE가 표시됩니다. 나는 그것이 Node.ELEMENT_NODE 여야한다고 생각한다. 내가 맞습니까?

그래서 노드를 Element로 변환하면 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> 

감사 :

여기 내 XML입니다!

+2

피싱이 없을 때 첫 번째 노드가 요소인지 텍스트인지 여부는 어떻게 알 수 있습니까? 보여주지 마라. 우리 문서 요? 강력하게 파서가 맞다고 생각합니다 ... 아마도 요소가 아닌 노드는 건너 뛰고 싶을 것입니다. –

+0

xml을 추가했습니다. 노드 은 텍스트가 아닌 요소 여야합니다. 나 맞아? – Student

+1

네,하지만 ''과 ''사이에 그리고 ''과 ''사이에 텍스트 요소 (줄 바꿈)가있을 것입니다. –

답변

6

Node 객체 n을 Element로 형 변환하면 java.lang.ClassCastException 예외가 발생합니다. org.apache.harmony.xml.dom.TextImpl을 org.w3c.dom.Element로 형변환 할 수 없습니다. Node 객체의 노드 유형을 확인하면 Node.TEXT_NODE가 표시됩니다. 나는 그것이 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

난 당신이 뭔가를해야한다고 생각 :

당신은 또한 당신의 캐스팅

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

하지만 다른 사람에 의해 지적, 텍스트 노드를 가지고, 그 원 '을 "보호"를 시도 할 수 있습니다

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

이 메소드로 캐스팅을 수행 할 때는 처리 할 코드가 다른 조건을 사용할 필요가 없음을 확인하십시오.

관련 문제