首次输入后,使用DOM解析器读取XML文件时会崩溃

时间:2014-02-17 22:41:03

标签: android xml dom

我在这个论坛中发现了很多关于XML解析的有用条目,然后编写了这段代码,用我的Android应用程序中的SD卡读取我的XML文件。 不幸的是,它只返回第一个值,并在它之后崩溃。

这是我的XML文件:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="testset">
        <item>ABCDEFGHIJKLMNOPQRSTUVWXYZ</item>
        <item>abcdefghijklmnopqrstuvwxyz</item>
    </string-array>   
        <string-array name="testsetxy">
        <item>ABCDEFGHIJKLMNOPQRSTUVWXYZ</item>
        <item>abcdefghijklmnopqrstuvwxyz</item>
    </string-array>  
</resources>

这是我的代码的解析部分:

public static List<Testset> parse(InputStream is) {
    List<Testset> tsList = null;
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    try {
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document xmlDoc = builder.parse(is);
        Element root = xmlDoc.getDocumentElement();
        NodeList listNodes = root.getElementsByTagName(NODE);
        Testset testset = new Testset();
        for(int i = 0; i < listNodes.getLength(); ++i) {
            Node curNode = listNodes.item(i);
           String name = ((Attr)(curNode.getAttributes().item(0))).getValue();
              testset.setName(name);
            NodeList listChilds = curNode.getChildNodes();
            List<String> testcases = null;
            for(int j = 0; j < listChilds.getLength(); ++j) {
                Node child = listChilds.item(j);
                if(child.getNodeType() == Node.ELEMENT_NODE) {
                    String childName = child.getNodeName();
                    String childValue = ((Element)child).getTextContent();
                    if(childName.equalsIgnoreCase(ITEM)) {
                        Log.v(TAG, childValue);
                        testcases.add(childValue);
                    }

                    else {
                        Log.v(TAG, "wrong XML format");
                    }
                }
            }
            testset.setTestcases(testcases);
        }
        tsList.add(testset);
        is.close();
    } catch (ParserConfigurationException e) {
        tsList = null;
    } catch (SAXException e) {
        tsList = null;
    } catch (IOException e) {
        tsList = null;
    }
    return tsList;
}

Log.v(TAG,childValue);返回第一个值的值。

任何人都知道我做错了什么?

由于

1 个答案:

答案 0 :(得分:0)

您在此代码中的问题:

List<Testset> tsList = null;
List<String> testcases = null;

您没有初始化这两个列表,因此在您在测试用例NullExceptionError中添加第一个子项后,您将面临List,因此代码Log工作一次然后触发的异常尝试初始化你的两个List喜欢那个

List<Testset> tsList = new ArrayList<Testset>();
List<String> testcases =  new ArrayList<String>();

喂我回来