XML Java读取Node?

时间:2014-05-27 18:01:10

标签: java xml nodes

这是我第一次使用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'..

感谢您的支持!

2 个答案:

答案 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;并设置它以避免可忽略的空格。