2013-04-02 138 views
9

我知道這被問了很多次,但我仍然無法使它工作。我將xml字符串轉換爲Document對象,然後解析它。下面是代碼: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(); 
} 

當我投的Node對象n至元我得到一個異常java.lang.ClassCastException:org.apache.harmony.xml.dom.TextImpl不能轉換爲org.w3c。 dom.Element。當我檢查節點對象的節點類型時,它表示Node.TEXT_NODE。我相信它應該是Node.ELEMENT_NODE。我對嗎?

那麼,我如何將Node轉換爲Element,所以我可以做類似element.getAttribute(「attrName」)的操作。

這裏是我的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> 

提前感謝!

+2

我們如何是爲了知道第一個節點是否應該是一個元素或者文本,當你的避風港不顯示我們的文件?我強烈懷疑解析器是正確的,雖然...我懷疑你可能只是想跳過非元素節點。 –

+0

我已經添加了xml。節點應該是一個元素,而不是文本。我對麼? – Student

+1

是的,但我認爲你會發現它''和''之間的文本元素(可能只是一個換行符) - 每個''和''之間。 –

回答

6

當我投的Node對象n至元我得到一個異常java.lang.ClassCastException:org.apache.harmony.xml.dom.TextImpl不能轉換爲org.w3c.dom.Element中。當我檢查節點對象的節點類型時,它表示Node.TEXT_NODE。我相信它應該是Node.ELEMENT_NODE。我對嗎?

可能不是,解析器可能是正確的。這意味着你正在解析的一些節點是text nodes。例如:

<foo>bar</foo> 

在上文中,我們有一個包含一個文本節點的foo元件。 (文本節點包含文本"bar"

同樣,考慮:

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

如果你的XML文檔字面上看起來像上面的,它包含了根元素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; 
    // ... 
} 

,但被別人當作指出,你有文本節點,那些韓元」牛逼通過這種方法來鑄造,確保你不需要他們使用的條件有不同的代碼來處理它們