2010-11-23 29 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のターゲットを抽出する必要があります。もちろん、私ははるかに多くを抽出する必要がありますが、実際にどのように使用するのか分かりません。これが始める場所です。

私はこれまでのところ、このコードを持っている:

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"); 

これは、ウェブ上のほとんどの例のように思えるが、この1のようになります。http://www.easywayserver.com/blog/java-how-to-read-xml-file/

私は私が抽出したいときに何をすべきかを考え出す助けが必要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を返します。
今すべきの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 apisを調べるべきです。

+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を抽出します。/*/visual_scene/@id
  • instance_geometryのURL:/*/visual_scene/node/instance_geometry/@url
  • 名SketchUpのあるノードのためのinstance_geometryのURLを:/*/visual_scene/node[@name = 'Sketchup']/instance_geometry/@url
  • instance_materialのターゲット:/*/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

を今日では、いくつかの

次の例では、ジオコード情報のGoogleの表現に簡単なアドレスオブジェクトをマップjava RADツールには、指定されたDTDからのJavaコードジェネレーターがあるので、それらを使用することができます。

関連する問題