2014-11-06 3 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에서 널 (null)에 도달 할 수 있습니다.자바에서 XML 노드를 얻으려고 노력

또한, 내가 무엇을 나타내는 NULL 얻을 돈`t : 노드 값을

  1. [ROOT : NULL] - 디버깅 할 때 내가 무엇을보고
  2. ? [BOOK : 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

+0

그리고 어떻게 생겼을까요? 그냥 학교 프로젝트 일뿐입니다 ... 저는 Google에서 검색 한 내용을 사용했습니다 ... 전에 Java로 XML을 사용하지 않았습니다. – Lulu

+0

XML 데이터의 유형에 SAX Parser를 제안합니다. 이후 작고 간단합니다. SAX 파서를 사용하면 Element (태그) 이름으로 데이터를 파싱 할 수 있습니다. 매우 쉽고 사용하기 쉽습니다. – Lokesh

답변

4

아이들은 공백 문자 (즉, 텍스트 내용) 등으로 인해 XML 내용의 들여 쓰기 :

지금 JAXB를 사용하는 방법에 대해 살펴. 따라서 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

hehe. – Joeblade

+1

당신은 절대적으로 굉장합니다! tnk u !! – Lulu

-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 { 
    .... 
} 

등, 등, ...

이 게터를 추가하고 자신을 세터. BOOKChapter

How to serialize and de-serialize objects using JAXB?

+1

질문에 대한 대답이 정말로 없습니다. – Joeblade

관련 문제