0

我在 Android 环境中解析一些 XML 文件时遇到问题...启动我的 android 应用程序后,我在 JAVA 环境下进行了一些解析 XML 的测试。

所以,我写了这段代码:

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

但是,在 Android 中使用它时会返回一个 ClassCastException。

我正在查找问题,并且(据我所知)问题如下:

Android 正在获取另一种“NodeList”(“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;
}

然后,我将“元素 e = (Element)n.getChildNodes()”更改为“org.w3c.dom.Element e = this.getElements(n)”

但是,在“getElements”方法中,发生了一些奇怪的事情......

“nl”仍然是“org.apache.harmony.xml.dom.NodeListImpl”,所以我仍然得到一个 ClassCastException。

那么,我可能需要获得“org.w3c.dom.NodeList”而不是“org.apache ...”NodeList 吗?

谢谢大家,对不起我的英语不好......:s

4

2 回答 2

0

NodeList 指向 0 个或多个节点,因此不能直接转换为节点/元素。根据结构,子节点可以包括元素以及节点的属性。

要从 NodeList 到达特定节点,您必须对其进行迭代。

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
}

另一种选择是查看给定的 Node 是否是一个元素,然后使用 getElementsByTagName("name") 进行查询,然后对其进行迭代以找到正确的元素,然后将其返回。

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

}
于 2013-07-16T20:31:10.177 回答
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 ...

于 2013-07-17T05:12:25.963 回答