簡體   English   中英

XML Java讀取Node?

[英]XML Java reads Node?

這是我第一次使用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>

Java的:

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'..

感謝你的支持!

這個<item>元素有一個節點

<Item id="1"><Clothes>...</Clothes></Item>

另一個有三個 其中兩個是看不見的:

<Item id="1">
     <Clothes>...</Clothes> 
</Item>

這里顯示了不可見的節點(我用[#...#]替換它們):

<Item id="1">[#
#####]<Clothes>...</Clothes>[#]
</Item>

它們是文本節點( Text ),它們包含所有空格字符,直到不同類型的下一個節點。 當您使用返回Node getFirstChild()等方法時,無論其類型如何,您都將獲得第一個Node 您不能總是假設它將是一個元素,除非您在解析源文檔時在元素之間划分了所有空格。 它仍然可能不是文檔注釋節點和處理指令節點也算作子節點。

訪問子元素節點的安全方法是測試節點是否實際上是一個元素。 可以做到這一點比較節點類型 ,其可以通過獲得getNodeType()方法和在常數Node接口,其表示節點類型,並跳過哪些不是元素的節點。

if(node.getNodeType() == Node.ELEMENT_NODE) { 
    // this is an element!
    Element myElement = (Node)node;
}

您還可以使用其他API,如DOM4J或JDOM,其中包括返回子元素的額外方法,標准XPath API,您可以在其中獲取元素的NodeList,或者可以從上下文元素調用的標准DOM方法,如getElementsByTagName引用並獲取子樹中的所有后代元素

在程序中,您可以通過提取getChildNodes()節點列表上的迭代並獲取節點類型與Node.ELEMENT_NODE匹配的第一個節點來檢索Clothes元素節點。

那是因為您的輸入XML是縮進的,因此它具有空白字符。 的第一個子Item實際上是一個文本節點,包含所有空間/選項卡/換行符,所述間存在>Item<Clothes

如果要避免這種情況,則必須壓縮XML文件,使其不包含標記之間的空格,或者將JAXP解析器設置為“驗證模式”並將其設置為避免可忽略的空格。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM