2014-11-06 32 views
2
 File fXmlFile = new File(path);//path is a String 
     DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
     Document XMLbook = dBuilder.parse(fXmlFile); 
     Node root = XMLbook.getFirstChild(); //(1) 
     Node book = XMLbook.getElementsByTagName("BOOK").item(0);//(2) 
     Node lastChapter=book.getLastChild();//(3) 
     Node lastSubChapter=lastChapter.getLastChild(); //(4) 
... 
} 

的問題是它達到lastSubChapter空,因此我的程序結束壞:(我不知道我做錯了什麼......代碼似乎不錯。試圖讓一個XML節點在Java中

另外,我不`噸得到什麼NULL表示:節點值

  1. [ROOT:NULL] - 我所看到的在調試時
  2. ?[書:NULL] - 我所看到的調試
  3. 時[ #text:] - wh在我看到調試時 - 這是什麼意思?
  4. 問題!這裏lastSubChapter得到NULL :(爲什麼

我從讀取XML文件是:?

<?xml version="1.0"?> 
    <ROOT> 
     <TITLE>Portocalia ca zapada</TITLE> 
     <BOOK> 
      <Chapter name="1"> 
       <Subchapter name="1.1"> 
        <paragraph>Primul paragraf!</paragraph> 
       </Subchapter> 
      </Chapter> 
      <Chapter name="2"> 
       <Subchapter name="2.1"> 
        <paragraph>A fost o data ca niciodata</paragraph> 
       </Subchapter> 
       <Subchapter name="2.2"> 
        <paragraph>In luna a13a ea s-a maritat.</paragraph> 
       </Subchapter> 
       <Subchapter name="2.3"> 
        <paragraph>In continuare, bineinteles</paragraph> 
        <paragraph>asa cum se intampla in toate povestile</paragraph> 
       </Subchapter> 
      </Chapter> 
     </BOOK> 
    </ROOT> 

我想要得到的最後一個節點Subchapter,其名稱爲 「2.3」 的一個

有另一種更安全的方式,我可以得到它呢?

+0

您有什麼特別的理由可以使用DOM嗎?你可以使用JAXB嗎? – AlexR 2014-11-06 16:56:32

+0

它會是什麼樣子? 這僅僅是一個學校項目... i've使用什麼我已經通過谷歌上搜索發現... i've從來沒有工作過個XML在Java中 – Lulu 2014-11-06 16:59:01

+0

之前,我建議SAX解析器對於這種類型的XML數據。因爲它小而簡單。 SAX解析器將允許您通過元素(標記)名稱解析數據。非常簡單易用。 – Lokesh 2014-11-06 17:03:13

回答

4

BOOKChapter孩子們還包括空白(即文本內容)。因此,getLastChild正在檢索空白文本而不是元素。

你可以簡單地通過Element#getElementsByTagName到達的元素,並獲得最後一個節點。

DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
Document XMLbook = dBuilder.parse(fXmlFile); 
Node root = XMLbook.getFirstChild(); //(1) 
Node book = XMLbook.getElementsByTagName("BOOK").item(0);//(2) 
NodeList chapterNodes = ((Element)book).getElementsByTagName("Chapter"); 
if(chapterNodes != null && chapterNodes.getLength() > 0) { 
    Node chapterNode = chapterNodes.item(chapterNodes.getLength() - 1); 
    NodeList subChapterNodes = ((Element)chapterNode).getElementsByTagName("Subchapter"); 
    if(subChapterNodes != null && subChapterNodes.getLength() > 0) { 
     Node subChapterNode = subChapterNodes.item(subChapterNodes.getLength() - 1); 
     System.out.println(subChapterNode.getNodeName()); 
    } 
} 
+0

嘿嘿,你打我吧。 – Joeblade 2014-11-06 17:12:27

+1

你絕對是真棒! tnk你! – Lulu 2014-11-06 21:41:33

-1

OK,據我理解你沒有限制使用JAXB。

所以從創建模型開始。像下面這樣:

@XmlRootElement 
class Root { 
    @XmlElement 
    private String title; 
    @XmlElement 
    private Book book; 
} 

@XmlRootElement 
class Book { 
    @XmlElement 
    private List<Chapter> chapters; 
} 

@XmlRootElement 
class Chapter { 
    .... 
} 

等,等,......

添加getter和setter自己。

現在來介紹如何使用JAXB一看:由於XML內容的縮進

How to serialize and de-serialize objects using JAXB?

+1

不是真正的問題的答案 – Joeblade 2014-11-06 17:13:10