【问题标题】:Android XML parser fetch key-value pairsAndroid XML 解析器获取键值对
【发布时间】:2015-10-28 01:12:05
【问题描述】:

我正在尝试解析 XML 文件。 XML文件的格式为:

<Testcase>
    <Title>Low Load</Title>
    <MO_Call>DIAL</MO_Call>
    <Delay>10</Delay>
    <MO_Call>HANGUP</MO_Call>
    <Delay>10</Delay>
    <MO_SMS>SEND</MO_SMS>
</Testcase>

我需要获取节点“Testcase”下的键值对并存储在数据结构中。排序很重要,因此我正在考虑使用 LinkedHashMap。

请建议从 XMl 文件中获取键值对的正确方法。 在上面的 XML sn-p 中,对应的键值对是: 键:MO_Call,值:DIAL 键:延迟,值:10

我已经编写了以下代码来解析 XML:

try {
    builder = factory.newDocumentBuilder();
    Document doc = builder.parse(new FileInputStream(CONFIG_PATH));
    doc.getDocumentElement().normalize();
    NodeList nodeList = doc.getElementsByTagName(TAG_TEST_CASE);
    if (nodeList != null && nodeList.getLength() > 0) {
        for (int i=0; i < nodeList.getLength(); i++) {
            Element el = (Element) nodeList.item(i);
            // If title doesn't match, check the next title under next 'Testcase' NodeList
            if(el.getFirstChild().getNodeName().equals(TAG_TITLE) &&
                    !el.getFirstChild().getNodeValue().equals(title)) {
                continue;
            }
            // else, title matches. So parse the child nodes.
            // Start from index 1, since index 0 is title always
            NodeList childNodeList = el.getChildNodes();
            for(int j=1; j < childNodeList.getLength(); j++) {
                Node childNode = childNodeList.item(j);
                //Element childElement = (Element) childNodeList.item(j);
                Log.d("Tool", "key=" +childNode.getNodeName()+ ", value=" +childNode.getTextContent());
            }
        }
    }
}

我得到了输出:

key=Title, value=Low Load
key=#text, value=
key=MO_Call, value=DIAL
key=#text, value=
key=Delay, value=10
key=#text, value=
key=MO_Call, value=HANGUP
key=#text, value=
key=Delay, value=10
key=#text, value=
key=MO_SMS, value=SEND
key=#text, value=
key=Title, value=Medium Load
key=#text, value=
key=Title, value=High Load
key=#text, value=

由于某种原因,键“#text”与空值一起出现。请帮我避免这种情况。

【问题讨论】:

  • XML 的结构非常糟糕。不应该依赖于 XML 中元素的顺序。如果您能够更改 XML 文件的生成方式,那么我建议您这样做。
  • @Squonk:通过排序,我的意思是项目需要按照它们出现在“Testcase”标签下的相同顺序执行。比如解析XML后,会先发生MO呼叫,然后延迟10秒,然后MO呼叫Hangup,再延迟10秒,然后发送短信。
  • @Squonk Android 布局严重依赖 XML 排序,JavaFX 也是如此。
  • 能否请您检查空值是否来自标签前后的空白字符(只需删除换行符和空白)?在我看来,缩进被读取为文本节点。
  • @Denis:是的,这似乎是一个确定的原因。将检查这一点并尽快更新。感谢您的帮助。

标签: android


【解决方案1】:

reffer here 联系#text。如果您可以更改 XML,请删除所有无意的空格,然后重新测试您的代码。

示例 XML:

<?xml version="1.0" encoding="UTF-8"?><Testcase><Title>Low Load</Title><MO_Call>DIAL</MO_Call><Delay>10</Delay><MO_Call>HANGUP</MO_Call><Delay>10</Delay><MO_SMS>SEND</MO_SMS></Testcase>

另外,请显示在 XML 文件中使用的编码,可能有拼写错误。

This is also a good suggestion on how to parse

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    • 2017-08-24
    • 2016-03-28
    • 1970-01-01
    相关资源
    最近更新 更多