【发布时间】:2012-08-21 09:32:45
【问题描述】:
我正在尝试使用 Java 中的 DOM 读取 XML
<?xml version="1.0"?>
<record>
<user>
<name>Leo</name>
<email>****@****.com</email>
<food-list>
<food>Hamburgers</food>
<food>Fish</food>
</food-list>
</user>
</record>
我目前的解决方案是
for (int userNumber = 0; userNumber < masterList.getLength(); userNumber++) {
Node singleUserEntry = masterList.item(userNumber);
if (singleUserEntry.getNodeType() == Node.ELEMENT_NODE) {
org.w3c.dom.Element userEntryElement = (org.w3c.dom.Element) singleUserEntry;
System.out.println("name : " + getTagValue("name", userEntryElement));
System.out.println("email : " +getTagValue("email", userEntryElement));
NodeList foodList = userEntryElement.getElementsByTagName("food-list").item(0).getChildNodes();
for(int i = 0; i < foodList.getLength(); i++){
Node foodNode = foodList.item(i);
System.out.println("food : " + foodNode.getNodeValue());
}
private static String getTagValue(String sTag, org.w3c.dom.Element eElement) {
NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes();
Node nValue = (Node) nlList.item(0);
return nValue.getNodeValue();
现在的输出是
name : Leo
email : ******@*****.com
food :
food : null
food :
food : null
food :
这让我很困惑。你能告诉我哪里错了吗?食物标签的数量没有预先定义。
【问题讨论】:
-
你能在你的循环中检查
foodNode.getNodeType()吗? -
NodeList foodList = userEntryElement.getElementsByTagName("food-list").getChildNodes();和节点 foodNode = foodList.item(i); if(fooNode.getNodeType() == Node.ELEMENT_NODE) { 元素 userEntryElement = (Element) foodNode ; foodNode.getNodeValue()}
-
@O.R.Mapper 如果我在打印之前在 for 循环中检查
foodNode.getNodeType == Node.Element_Node,我会得到两个空输出 -
@Nambari 你能告诉我你为什么要重新分配 userEntryElement 吗?
-
@YankeeWhiskey 试试
((Node) foodNode.getChildNodes().item(0)).getNodeValue()