2013-07-16 75 views
0

XML解析我有一些解析XML文件在Android的環境... 問題開始我的Android應用程序後,我做了一些測試,JAVA環境下解析XML。ClassCastException異常與Android的

所以,我寫了這個代碼:

private void addMeta(Node n){ 
    String[] fields = {"src", "timestamp", "title", "kind", "ref", "crcData"}; 
    Element e = (Element)n.getChildNodes(); 
    //... more code 
} 

但是,在Android中使用此當返回我一個ClassCastException。

我一直在尋找時發現了問題,(因爲我能理解)的問題如下:

Android是存在另一種「節點列表」(數據由「n.getChildNodes返回類型( )「。Android獲取的數據類型是:org.apache.harmony.xml.dom.NodeListImpl。

所以,看到這個,我改變了我的代碼,從一個直接轉換到一個執行它的方法。是:

private org.w3c.dom.Element getElements(Node n){ 
    org.w3c.dom.NodeList nl = (org.w3c.dom.NodeList)n.getChildNodes(); 
    return (org.w3c.dom.Element)nl; 
} 

然後,我改變「Element e =(Element)n.getChildNodes()」由「org.w3c.dom.Element中的E = this.getElements(N)」

但是,內部 「的getElements」 的方法,奇怪的事情發生了......

「NL」 仍getted爲「org.apache .harmony.xml.dom.NodeListImpl「,所以我仍然得到一個ClassCastException。

所以,我可能要得到一個「org.w3c.dom.NodeList」而不是「org.apache ......」節點列表?

感謝你們,爲我的英語不好...對不起:■

+0

請確保您有正確的在你的課堂上進口。 – kosa

+0

我認爲如果我使用限定名稱(org.w3c.dom.Element)不需要進行任何導入...明天我會嘗試添加導入。 – David

+0

我檢查了導入並正確導入了(org.w3c.dom.Element,org.w3c.dom.NodeList ...) – David

回答

0

節點列表指向0或多個節點,因此不能直接轉換爲一個節點/元素。根據結構,孩子可以包含節點的元素和屬性。

要獲得從節點列表中的特定節點,你必須遍歷它。

for (int i = 0; i < nodeList.getLength(); i++) { 
    Node item = nodeList.item(i); 
    // if this matches the element name you're 
    // looking for then return else continue 
} 

另一種選擇是看給定的節點是否是一個元素,然後查詢中使用的getElementsByTagName(「名」),然後遍歷它來找到合適的人,然後返回。

if (node.getNodeType() == Node.ELEMENT_NODE) { 
    Element e = (Element) node; 
    NodeList elements = e.getElementsByTagName("name_of_tag_you_want"); 
    // process node list and find the right one and return 

} 
0

感謝您的回答。

但是,解析我的XML時,我照顧得到總是與子節點(因此,getChildNodes總是返回的NodeList)。

叫 「addMeta」 之前,我遍歷節點,使用一些功能:

起點是 「補」 的方法:

public boolean fill(String[] curr, String file){ 
    try{ 
     Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(new java.io.StringReader(file))); 

     doc.getDocumentElement().normalize(); 

     for(int i=0;i<curr.length;i++) 
      this.treat((doc.getElementsByTagName(curr[i])), curr[i]); 
    }catch(ParserConfigurationException e){ 
     this.error = Strings.PARSEEXCEPTION.getValue(); 
     this.exception = e; 
     return false; 
    }catch(SAXException e){ 
     this.error = Strings.SAXEXCEPTION.getValue(); 
     this.exception = e; 
     return false; 
    }catch(IOException e){ 
     this.error = Strings.IOEXCEPTION.getValue(); 
     this.exception = e; 
     return false; 
    } 

    return this.check(); 
} 

那麼, 「治療」 方法:

private void treat(NodeList nl, String kind){ 
    for(int i=0;i<nl.getLength();i++) 
     this.add(nl.item(i), kind); 
} 

「添加」 方法:

private void add(Node n, String kind){ 
    if(kind.equals("meta")) 
     this.addMeta(n); 
      //... more code 

而且,在「addMeta」中,我試圖獲得的所有項目都有孩子。在XML的基本結構,我試圖解析:

<?xml version="1.0" encoding="utf-8"?> 
<Document xmlns="myweb/myxmlns.xsd"> 
<meta> 
    <generator> 
     <src>62.83.204.127</src> 
     <timestamp>1359743849</timestamp> 
    </generator> 
    <doc> 
     <title>Title</title> 
     <kind>m</kind> 
    </doc> 
    <ext> 
     <authUser> 
      <ref>David-Solé-González-1</ref> 
     </authUser> 
    </ext> 
    <crcData>2e021a71461e5a1bf6b71a5779446857a1d6b073</crcData> 
</meta> 
</Document> 

,當然它運作良好,在JAVA,但Android是給一個ClassCastException的...