在java中解析xml - getTextContent()和getNodeValue()只返回\ n,\ t和空格

时间:2011-09-12 19:02:19

标签: java xml

我在java中解析一些XML时遇到了一些麻烦。我的XML文件被正确读取,并且我能够使用节点的getTextContent()函数从文件中获取大部分信息(例如,在xml片段中显示的StreamType节点)。

但是,当我尝试使用节点的子节点时,getNodeValue()和getTextContent()都返回此随机值:“\ n \ t \ t”。

NodeList propertyNodes似乎已正确填充(包含所有18个“Property”元素)。

以下是我的代码中的代码段:

Document document;
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
document = builder.parse(appXML);

...

String typeName = document.getElementsByTagName("StreamType").item(0).getTextContent();

...

String limit = "-1";
NodeList propertyNodes = document.getElementsByTagName("Property");
int nodelistlength = propertyNodes.getLength();
for (int i = 0; i < nodelistlength; i++) {
    Node currentNode = propertyNodes.item(i);
    Node nameNode = currentNode.getFirstChild();
    Node valueNode = currentNode.getLastChild();

    String name = nameNode.getNodeValue();
    String value = valueNode.getNodeValue();

    if (nameNode.getTextContent().equalsIgnoreCase("maxConnections"))
        limit = valueNode.getTextContent();
}

这里有一些来自我试图解析的XML的剪辑:

<Root>
 <Application> 
  <Streams>
   <StreamType>live</StreamType>
   ...
  </Streams>

  ...

  <Properties> 

   ...

   <Property>
    <Name>maxConnections</Name> 
    <Value>1000</Value> 
   </Property> 

   ...

  </Properties>
 </Application>
</Root>

知道我在这里做错了什么吗?非常感谢!

编辑:现在可以使用,感谢@home发布的教程。这就是我修复代码的方法:

1)修改了以“字符串限制”开头并以for循环结束括号结尾的代码块:

String limit = "-1";
NodeList propertyNodes = document.getElementsByTagName("Property");
for (int i = 0; i < propertyNodes.getLength(); i++) {
    Node currentNode = propertyNodes.item(i);

    if (currentNode.getNodeType() != Node.ELEMENT_NODE)
        continue;

    Element currentElement = (Element)currentNode;

    if (getTagValue("Name",currentElement).equalsIgnoreCase("maxConnections"))
        limit = getTagValue("Value",currentElement);
}

2)在教程中添加了这个方便的功能:

private static String getTagValue(String sTag, Element eElement) {
    NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes();
    Node nValue = (Node) nlList.item(0);
    return nValue.getNodeValue();
}

现在可以完美地获取“Properties”元素的子名称/值对。非常感谢!

2 个答案:

答案 0 :(得分:8)

遗憾的是,Java DOM并不那么容易使用。您必须区分不同的节点类型。不是最好的教程,但这是我刚刚使用Google找到的:http://mkyong.com/java/how-to-read-xml-file-in-java-dom-parser

答案 1 :(得分:3)

这是节点值的正确内容。

<a>
    <b>
        stuff
    </b>
</a>

a节点的值(在本例中等于文本内容)正确地由开始和结束标记之间的空格组成,当然省略了b标记中的空格因为那,它属于b标签,而不属于a