[英]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.