2014-07-22 1 views
0

xml 스키마 계층 구조에서 주어진 수준의 요소 이름을 어떻게 나열합니까? 아래에있는 코드는 중첩 개념이없는 계층 구조의 모든 수준에서 모든 요소 이름을 나열합니다.xml 입력 파일의 계층 탐색

public static void parseFile() { 
    //get the factory 
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
    try { 
     //Using factory get an instance of document builder 
     DocumentBuilder db = dbf.newDocumentBuilder(); 
     //parse using builder to get DOM representation of the XML file 
     Document dom = db.parse("D:\\mypath\\somefile.xml"); 
     //get the root element 
     Element docEle = dom.getDocumentElement(); 
     //get a nodelist of elements 
     NodeList nl = docEle.getElementsByTagName("*"); 
     if (nl != null && nl.getLength() > 0) { 
      for (int i = 0; i < nl.getLength(); i++) { 
       Node node = nl.item(i); 
       if (node.getNodeType() == Node.ELEMENT_NODE) { 
        System.out.println("node.getNodeName() is: "+node.getNodeName()); 
       } 

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

위 프로그램의 출력은 다음과 같습니다 :

title 
languageCode 
versionNumber 
recordTarget 
someRole 
id 
addr 
streetAddressLine 
city 
state 
postalCode 
country 
telecom 
다음
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><?xml-stylesheet type="text/xsl" href="CDA.xsl"?> 
<SomeDocument xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:something"> 
<title>some title</title> 
<languageCode code="en-US"/> 
<versionNumber value="1"/> 
<recordTarget> 
    <someRole> 
     <id extension="998991"/> 
     <addr use="HP"> 
      <streetAddressLine>1357 Amber Drive</streetAddressLine> 
      <city>Beaverton</city> 
      <state>OR</state> 
      <postalCode>97867</postalCode> 
      <country>US</country> 
     </addr> 
     <telecom value="tel:(816)276-6909" use="HP"/> 
    </someRole> 
</recordTarget> 
</SomeDocument> 

XML 파일을 가져 와서 반복 내 자바 방법 : 여기

내 XML 파일입니다

대신 다음을 출력하고 싶습니다.

title 
languageCode 
versionNumber 
recordTarget 

그런 다음 id, addrtelecomsomeRole의 아이들을 나열하려면 다음 someRolerecordTarget의 자녀를 나열 할 수 및 수 좋을 것입니다. 그리고 계속해서,하지만 코드의 재량에 따라. 원하는 출력을 얻기 위해 코드를 어떻게 변경합니까?

+0

당신이 JAXB 사용을 고려 했습니까? 낮은 수준의 API를 사용하는 DOM 트리는 사용하기가 쉽지 않습니다. – laune

+0

@laune 제안 해 주셔서 감사합니다. 내 응용 프로그램의 엔터티 모델이 xml 스키마에 직접 매핑되지 않습니다. JAXB는 xml에서 객체 이름과 속성으로의 확실한 매핑을 요구합니까? – CodeMed

답변

1

이 줄을 모든 노드가 있어요 :

NodeList nl = docEle.getElementsByTagName("*"); 

변경이

NodeList nl = docEle.getChildNodes(); 

에 모든 자식을 얻을 수 있습니다. 그러면 print 서술문에서 찾고자하는 결과를 얻을 수 있습니다.

당신이 당신의 NodeList를 통해 반복 할 때 그런 다음, 각 노드에서 동일한 메소드를 호출하도록 선택할 수 있습니다 당신은 만들 :

NodeList children = node.getChildNodes(); 

당신이 XML 같은 구조, 아마도 재귀 적 방법을 인쇄 할 경우 그 모든 자식 노드를 인쇄하면 찾고있는 것입니다.

+0

+1 그리고 답장 시간을내어 주셔서 감사합니다. – CodeMed

1

당신은 자식 요소 이름 인쇄하고자하는 요소 이름을 지정하는 입력 String 취할 수 parseFile (I 오히려 parseChildrenElementNames를 호출 것) 방법을 다시 작성할 수

public static void parseChildrenElementNames(String parentElementName) { 
    // get the factory 
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
    try { 
     // Using factory get an instance of document builder 
     DocumentBuilder db = dbf.newDocumentBuilder(); 
     // parse using builder to get DOM representation of the XML file 
     Document dom = db 
       .parse("D:\\mypath\\somefile.xml"); 
     // get the root element 
     NodeList elementsByTagName = dom.getElementsByTagName(parentElementName); 
     if(elementsByTagName != null) { 
      Node parentElement = elementsByTagName.item(0); 
      // get a nodelist of elements 
      NodeList nl = parentElement.getChildNodes(); 
      if (nl != null) { 
       for (int i = 0; i < nl.getLength(); i++) { 
        Node node = nl.item(i); 
        if (node.getNodeType() == Node.ELEMENT_NODE) { 
         System.out.println("node.getNodeName() is: " 
           + node.getNodeName()); 
        } 

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

을 그러나이 경우 지정된 이름과 일치하는 첫 번째 요소 만 고려됩니다.

예를 들어, 당신은 인쇄 것이다 parseChildrenElementNames("someRole"); 부를 것이다 someRole라는 이름의 첫 번째 노드에서 요소의 목록을 얻을 수 있습니다 :

node.getNodeName() is: id 
node.getNodeName() is: addr 
node.getNodeName() is: telecom 
+0

+1 그리고 답장 시간을내어 주셔서 감사합니다. – CodeMed