2011-10-26 3 views
1

: http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=nucleotide&id=224589801구문 분석 XML 파일 나는 다음과 같은 URL을 구문 분석 할

나는 다음과 같은 방법을 해낸 결과 :

public void parseXml2(String URL) { 
    DOMParser parser = new DOMParser(); 

    try { 
     parser.parse(new InputSource(new URL(URL).openStream())); 
     Document doc = parser.getDocument(); 

     NodeList nodeList = doc.getElementsByTagName("Item"); 
     for (int i = 0; i < nodeList.getLength(); i++) { 
      Node n = nodeList.item(i); 
      Node actualNode = n.getFirstChild(); 
      if (actualNode != null) { 
       System.out.println(actualNode.getNodeValue()); 
      } 
     } 

    } catch (SAXException ex) { 
     Logger.getLogger(TaxMapperXml.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (IOException ex) { 
     Logger.getLogger(TaxMapperXml.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

나는 값을 사용할 수 있습니다이 방법을 항목 노드 중 하나만 사용할 수는 있지만 그 속성은 사용할 수 없습니다. NamedNodeMap을 사용하여 getAttribute()를 시도했지만 여전히 유용하지 않았습니다.

  1. 왜 실제 값을 얻으려면 n.getFirstChild().getNodeValue();해야합니까? n.getNodeValue()은 null 만 반환합니까? 반대로 직관적이지 않은가? 분명히 내 경우에는 노드에 하위 노드가 없다.

  2. DOM을 사용하여 XML 파일을 구문 분석하는 좀 더 강력하고 널리 수용되는 방법이 있습니까? 내 파일은거야 대부분의 큰 15 ~ 20 개 라인하지, 그래서 SAX는 필요하지 않습니다 (또는 무엇입니까?)

+0

DOM 주위에서 작업을 수행하기 위해 간단한 도우미 클래스를 작성할 수 있습니다. http://stackoverflow.com/a/8346867/851432 – Jomoos

답변

5
import java.io.IOException; 
import java.net.URL; 
import org.apache.xerces.parsers.DOMParser; 

import org.w3c.dom.Document; 
import org.w3c.dom.NamedNodeMap; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 
import org.xml.sax.InputSource; 

public class XMLParser { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     parseXml2("http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=nucleotide&id=224589801"); 
    } 

    public static void parseXml2(String URL) { 
     DOMParser parser = new DOMParser(); 

     try { 
      parser.parse(new InputSource(new URL(URL).openStream())); 
      Document doc = parser.getDocument(); 

      NodeList nodeList = doc.getElementsByTagName("Item"); 
      for (int i = 0; i < nodeList.getLength(); i++) { 
       System.out.print("Item "+(i+1)); 
       Node n = nodeList.item(i); 
       NamedNodeMap m = n.getAttributes(); 
       System.out.print(" Name: "+m.getNamedItem("Name").getTextContent()); 
       System.out.print(" Type: "+m.getNamedItem("Type").getTextContent()); 
       Node actualNode = n.getFirstChild(); 
       if (actualNode != null) { 
        System.out.println(" "+actualNode.getNodeValue()); 
       } else { 
        System.out.println(" ");      
       } 
      } 

     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 
} 

샘플 코드를 완료하고 속성을 얻을 수있는 몇 줄을 추가 .

DOM의 기본 개념에 익숙해 져야한다고 생각하지만, 시작해야합니다. This 사이트 (및 많은 다른 사람들)가 귀하를 도울 수 있습니다. 가장 중요한 것은 여러 종류의 노드를 이해하는 것입니다.

6
  1. XML 태그로 둘러싸인 텍스트 값은 DOM의 노드로 간주됩니다. 그렇기 때문에 값을 얻기 전에 Node 노드를 가져와야합니다. <Item>에있는 노드의 수를 계산하려고하면 텍스트가있을 때마다 노드가 있음을 알 수 있습니다.

  2. 에는 더 직관적 인 인터페이스가 있지만 org.w3c.dom.* 인터페이스가 없습니다.

당신이 빌드 - 파서를 사용하려는 경우, 당신은 http://www.java-samples.com/showtutorial.php?tutorialid=152

보고해야하는 DOMParser 당신이 타당성있는 사용하려고하고 휴대용 아니다.

+0

예 또는 jdom을 참조하십시오. –

1

하위 요소를 텍스트와 혼합 할 수 있기 때문에 xml 요소 내부의 텍스트가 텍스트 노드에 있습니다. 예를 들면 다음과 같습니다.

... 
<A>blah<B/>blah</A> 
... 

요소 A에는 텍스트 노드, 요소 B, 다른 텍스트 노드가 있습니다.