【发布时间】: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