【发布时间】:2011-09-12 19:02:18
【问题描述】:
我在用 java 解析一些 XML 时遇到了一点麻烦。我的 XML 文件被正确读取,我可以使用节点的 getTextContent() 函数从文件中毫无问题地获取大部分信息(即 StreamType 节点,显示在 xml sn-p 中)。
但是,当我尝试使用节点的子节点时,getNodeValue() 和 getTextContent() 都会返回这个随机值:“\n \t\t”。
NodeList propertyNodes 似乎已正确填充(包含所有 18 个“Property”元素)。
这是我的代码中的一个 sn-p:
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) 修改了以“String limit”开头并以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();
}
它现在可以完美地获取“属性”元素的子名称/值对。非常感谢!
【问题讨论】:
-
有什么理由不能使用 JAXB?
-
@home,您的教程解决了我的问题,现在我的代码可以工作了!您能否将其发布为答案,以便我将其标记为“最佳”并给予支持?非常感谢! :)
-
@Katherine Williams:添加了答案:-)