2011-07-11 58 views
1

我有這樣的XML文檔的XML文件:獲取錯誤解析使用JDOM

<?xml version="1.0" encoding="utf-8"?> 
<RootElement> 
    <Achild> 
     ..... 
    </Achild> 
</RootElement> 

如何檢查,如果文檔包含Achild元素或沒有?我試過

final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
// Use the factory to create a builder 
try { 
    final DocumentBuilder builder = factory.newDocumentBuilder(); 
    final Document doc = builder.parse(configFile); 
    final Node parentNode = doc.getDocumentElement(); 
    final Element childElement = (Element) parentNode.getFirstChild(); 
    if(childElement.getNodeName().equalsIgnoreCase(... 

但它給了我一個錯誤(childElement爲空)。

+0

* *什麼是'null',是childElement本身,它的節點名稱或其他什麼東西? –

+0

你的意思是一個叫做「AChild」的標籤,還是你的意思是一般的孩子節點? – RMT

+0

我的意思是一個名爲「Achild」的孩子節點 –

回答

1

我認爲你要#text節點(即<RootElement>之間<Achild>)(這是相當常見的錯誤)的第一個孩子,例如:

final Node parentNode = doc.getDocumentElement(); 
Node childElement = parentNode.getFirstChild(); 
System.out.println(childElement.getNodeName()); 

返回:

#text 

使用相反:

final Node parentNode = doc.getDocumentElement(); 
NodeList childElements = parentNode.getChildNodes(); 
for (int i = 0; i < childElements.getLength(); ++i) 
{ 
    Node childElement = childElements.item(i); 
    if (childElement instanceof Element) 
     System.out.println(childElement.getNodeName()); 
} 

通緝resulul T:

Achild 

編輯:

有使用DocumentBuilderFactory.setIgnoringElementContentWhitespace方法第二種方式:

factory.setIgnoringElementContentWhitespace(true); 

但是這隻有在驗證模式,所以你需要在XML文檔中提供DTD :

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE RootElement [ 
    <!ELEMENT RootElement (Achild)+> 
    <!ELEMENT Achild (#PCDATA)> 
]> 
<RootElement> 
    <Achild>some text</Achild> 
</RootElement> 

and s et factory.setValidating(true)。完整的示例:

final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
factory.setValidating(true); 
factory.setIgnoringElementContentWhitespace(true); 
final DocumentBuilder builder = factory.newDocumentBuilder(); 
final Document doc = builder.parse("input.xml"); 

final Node rootNode = doc.getDocumentElement(); 
final Element childElement = (Element) rootNode.getFirstChild(); 

System.out.println(childElement.getNodeName()); 

想與原代碼的結果是:

Achild 
+0

我是搖滾明星。非常感謝你... –

+0

@Saurabh:不客氣。請注意,JDOM API(http://www.jdom.org/docs/apidocs/)與標準Java DOM API(包含在JDK中)不同。 –

+0

我有一個問題喜歡做parentNode.getChildNodes();會得到我的ACHild的子節點,也可能只是RootElement的子節點。因爲我不想要Achild的子節點,並且如果他正在迭代那個,那麼這將花費我表現明智的.... :) –

0

它聽起來像.getFirstChild()返回給你一個包含「」和「」之間的空白的文本節點,在這種情況下,你需要前進到下一個兄弟節點去到你期望的位置。