2010-11-23 8 views
1

Java에서 XML 파일을 읽는 방법에 대한 수많은 예제를 보았습니다. 그러나 그들은 단순한 XML 파일만을 보여줍니다. 예를 들어 XML 파일에서 이름과 성을 추출하는 방법을 보여줍니다. 그러나 collada XML 파일에서 데이터를 추출해야합니다. 이와 같이 :Java에서 고급 XML 파일을 구문 분석하는 방법

<library_visual_scenes> 
    <visual_scene id="ID1"> 
     <node name="SketchUp"> 
      <instance_geometry url="#ID2"> 
       <bind_material> 
        <technique_common> 
         <instance_material symbol="Material2" target="#ID3"> 
          <bind_vertex_input semantic="UVSET0" input_semantic="TEXCOORD" input_set="0" /> 
         </instance_material> 
        </technique_common> 
       </bind_material> 
      </instance_geometry> 
     </node> 
    </visual_scene> 
</library_visual_scenes> 

이것은 콜라다 파일의 일부에 지나지 않습니다. 여기서 visual_scene의 id를 추출한 다음 instance_geometry의 url과 instance_material의 target을 추출해야합니다. 물론 나는 훨씬 더 많은 것을 추출해야하지만, 실제로 사용하는 방법을 이해하지 못하고 이것은 시작할 곳입니다.

지금까지이 코드를 가지고 : 내가 추출 할 때 무엇을 알아내는 데 도움이 필요 http://www.easywayserver.com/blog/java-how-to-read-xml-file/

:

그것은 웹에있는 대부분의 예처럼 보인다
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder builder = null; 
try { 
    builder = factory.newDocumentBuilder(); 
} 
catch(ParserConfigurationException error) { 
    Log.e("Collada", error.getMessage()); return; 
} 
Document document = null; 
try { 
    document = builder.parse(string); 
} 
catch(IOException error) { 
    Log.e("Collada", error.getMessage()); return; 
} 
catch(SAXException error) { 
    Log.e("Collada", error.getMessage()); return; 
} 
NodeList library_visual_scenes = document.getElementsByTagName("library_visual_scenes"); 

이 하나와 유사한를 더 깊은 태그 또는 XML 파일 읽기/파싱에 대한 좋은 자습서를 찾으십시오.

+2

XML이 매우 크지 않은 경우'javax.xml.xpath'를 사용하고 SAX 이벤트는 그렇지 않은 경우를 필터링합니다. – khachik

+1

또는 XMLBeans 또는 JAXB ... – bmargulies

+0

다음을보십시오 : http://www.saxproject.org/quickstart.html – krico

답변

4

코드에서 DOM을 사용하고 있습니다.
DOM은 구문 분석 한 XML 파일의 트리 구조를 만들고 다양한 노드의 정보를 얻기 위해 트리를 탐색해야합니다.
코드에서 트리 표현을 만드는 것이 전부입니다. 나는.

document = builder.parse(string);//document is loaded in memory as tree 

이제 필요한 정보를 얻는 방법을 보려면 DOM API를 참조해야합니다.

NodeList library_visual_scenes = document.getElementsByTagName("library_visual_scenes"); 

예를 들어이 메서드는 지정된 이름을 가진 모든 요소의 NodeList를 반환합니다.
이제해야 노드 목록

for (int i = 0; i < library_visual_scenes.getLength(); i++) { 
    Element element = (Element) nodes.item(i); 
    Node visual_scene = element.getFirstChild(); 
    if(visual_scene.getNodeType() == Node.ELEMENT_NODE) 
    { 
     String id = ((Element)visual_scene).getAttribute(id); 
     System.out.println("id="+id); 
    } 
} 

부인 돌이 :이 샘플 코드입니다. 그것을 컴파일하지 않았습니다. 그것은 당신에게 개념을 보여줍니다. 당신은 DOM API를 조사해야합니다.

+0

DOM을 기회로 제공 할 것입니다. 주로 이것이 내가 시작한 방식 이었기 때문에 주로 보였습니다. 나는 또한 좋은 기본 튜토리얼처럼 보이는 것을 발견 : http://www.roseindia.net/xml/dom/ – Espen

6

builder.parse(string)에 전화 할 때 실제로 구문 분석이 완료되었습니다. 지금 알아야 할 것은 구문 분석 된 XML 문서에서 정보를 선택/쿼리하는 방법입니다.

나는 그것을 수행하는 방법에 관해 @khachik에 동의 할 것이다. (아무도 대답을 게시 한 이후로 아무도 대답하지 않음) :

XPath는 정보를 추출하는 가장 편리한 방법이며, 입력 된 문서가 크지 않은 경우 XPath가 빠릅니다. Here은 Java의 XPath에 대한 좋은 시작 안내서입니다. SAX는 선형 액세스 용으로 설계 되었기 때문에 XML 데이터에 임의 액세스해야하는 경우 (예 : 원본 문서에 표시된 순서와 다른 순서로 트리에서 데이터를 추출해야하는 경우) XPath를 사용하는 것이 좋습니다.

일부 샘플 XPath 식 : /*/visual_scene/@id

  • instance_geometry의 URL :

    • 이 visual_scene의 ID를 추출 /*/visual_scene/node/instance_geometry/@url
    • 이름이 노드에 대한 instance_geometry의 URL은 스케치 업 : /*/visual_scene/node[@name = 'Sketchup']/instance_geometry/@url
    • 을 인스턴스 _ 재료의 목표 : /*/visual_scene/node/instance_geometry/bind_material/technique_common/instance_material/@target

    COLLADA 모델은 실제로 크기가 커서 SAX 기반 필터를 사용해야 할 수 있습니다.이 필터를 사용하면 문서를 한 번에 메모리에 모두 저장하지 않고도 스트림 모드로 처리 할 수 ​​있습니다. 그러나 XML을 파싱하는 기존 코드가 이미 잘 수행되고 있다면 SAX가 필요하지 않을 수 있습니다. SAX는 XPath보다 특정 데이터를 추출하는 데 더 복잡합니다.

  • 1

    EclipseLink JAXB (MOXy)에는 XPath를 활용하여 개체를 채우는 데 유용한 @XmlPath 확장이 있습니다. 그것은 당신이 찾고있는 것일 수 있습니다. 참고 : 저는 MOXy 기술 책임자입니다. 참조 예제의 나머지

    package blog.geocode; 
    
    import javax.xml.bind.annotation.XmlRootElement; 
    import javax.xml.bind.annotation.XmlType; 
    
    import org.eclipse.persistence.oxm.annotations.XmlPath; 
    
    @XmlRootElement(name="kml") 
    @XmlType(propOrder={"country", "state", "city", "street", "postalCode"}) 
    public class Address { 
    
        @XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:SubAdministrativeArea/ns:Locality/ns:Thoroughfare/ns:ThoroughfareName/text()") 
        private String street; 
    
        @XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:SubAdministrativeArea/ns:Locality/ns:LocalityName/text()") 
        private String city; 
    
        @XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:AdministrativeAreaName/text()") 
        private String state; 
    
        @XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:CountryNameCode/text()") 
        private String country; 
    
        @XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:SubAdministrativeArea/ns:Locality/ns:PostalCode/ns:PostalCodeNumber/text()") 
        private String postalCode; 
    
    } 
    

    :

    0

    를 요즘, 여러

    다음 예는 지오의 정보를 구글의 표현에 간단한 주소 객체를 매핑 java RAD 도구는 주어진 DTD에서 Java 코드 생성기를 가지므로이를 사용할 수 있습니다.

    관련 문제