这是我第一次使用Java编写XML文件。
我有一个简单的XML文件:
<?xml version="1.0" encoding="UTF-8"?>
<ItemList>
<Item id="1">
<Clothes>
<element1>Test Cloth</element1>
<element2>1</element2>
<element3>true</element3>
<element4>1</element4>
<element5>100</element5>
<element6>4</element6>
<element7>false</element7>
</Clothes>
</Item>
</ItemList>
爪哇:
InputStream is = ItemsLoader.class.getResourceAsStream("ItemList.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(is);
doc.getDocumentElement().normalize();
NodeList nList = doc.getElementsByTagName("Item");
for (int i = 0; i < nList.getLength(); i++) {
Node nNode = nList.item(i);
Element eItemElement = (Element)nNode;
Node elementNode = eItemElement.getFirstChild();
System.out.println("Item Node name: " + nNode.getNodeName());
System.out.println("Element Node name: " + elementNode.getNodeName());
}
我的输出是:
物品
文字#
为什么我无法获得子节点? Item的子节点应为'Clothes'..
感谢您的支持!
答案 0 :(得分:2)
此<item>
元素有一个子Node:
<Item id="1"><Clothes>...</Clothes></Item>
另一个三。其中两个是不可见的:
<Item id="1">
<Clothes>...</Clothes>
</Item>
此处显示不可见的节点(我将其替换为[#...#]
):
<Item id="1">[#
#####]<Clothes>...</Clothes>[#]
</Item>
它们是文本节点(Text),它们包含所有空白字符,直到下一个不同类型的节点。当您使用返回getFirstChild()
的{{1}}等方法时,无论其类型如何,您都将获得第一个Node
。您不能总是假设它将是一个元素,除非您在解析源文档时在元素之间划分了所有空格。它仍然可能不是文档Comment节点,Processing Instruction节点也算作子节点。
访问子元素节点的安全方法是测试节点是否实际上是一个元素。您可以比较您可以通过getNodeType()方法获得的节点类型和Node
接口中表示节点类型的常量,并跳过非元素的节点。
Node
您还可以使用其他API,如DOM4J或JDOM,其中包括返回子元素的额外方法,标准XPath API,您可以获取元素的NodeList作为结果,或标准DOM方法,如getElementsByTagName您可以从上下文元素引用中调用并从子树中获取所有后代元素。
在您的程序中,您可以通过提取if(node.getNodeType() == Node.ELEMENT_NODE) {
// this is an element!
Element myElement = (Node)node;
}
节点列表上的迭代并获取节点类型匹配为Clothes
的第一个节点来检索getChildNodes()
元素节点。
答案 1 :(得分:1)
那是因为你的输入XML是缩进的,因此它有空格字符。
Item
的第一个子节点实际上是一个文本节点,包含>
Item
与<
Clothes
之间存在的所有空格/制表符/换行符}。
如果你想避免这种情况,你必须压缩你的XML文件,使它不包含标签之间的空格,或者将你的JAXP解析器设置为&#34;验证模式&#34;并设置它以避免可忽略的空格。