1

JavaでXMLファイルを読み取る方法について多くの例を見てきました。ただし、表示されるのは単純なXMLファイルのみです。たとえば、XMLファイルから名前と名前を抽出する方法を示しています。ただし、ColladaXMLファイルからデータを抽出する必要があります。このような:

<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>

これは、Colladaファイルのごく一部にすぎません。ここでは、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" );

Web上のほとんどの例は次の例に似ているようです:http ://www.easywayserver.com/blog/java-how-to-read-xml-file/

より深いタグを抽出したり、XMLファイルの読み取り/解析に関する優れたチュートリアルを見つけたい場合は、どうすればよいかを理解するのに助けが必要です。

4

4 に答える 4

6

実際、を呼び出すと、解析自体はすでに完了していますbuilder.parse(string)。ここで知っておく必要があるのは、解析されたXMLドキュメントから情報を選択/クエリする方法です。

その方法については@khachikに同意します。少し詳しく説明します(他に誰も回答を投稿していないため):

XPathは情報を抽出するための最も便利な方法であり、入力ドキュメントが巨大でない場合、XPathは十分に高速です。これは、JavaでのXPathに関する優れた開始チュートリアルです。XPathは、XMLデータへのランダムアクセスが必要な場合(つまり、ソースドキュメントに表示される順序とは異なる順序でツリーからデータを抽出する必要がある場合)にも推奨されます。SAXは線形アクセス用に設計されているためです。

いくつかのサンプル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よりも特定のデータの抽出に使用する方が複雑です。

于 2010-11-23T21:32:02.193 に答える
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);
    }
 }

免責事項:これはサンプルコードです。コンパイルしていません。それはあなたに概念を示しています。DOMAPIを調べる必要があります。

于 2010-11-23T21:41:34.583 に答える
1

EclipseLink JAXB(MOXy)には、XPathを利用してオブジェクトにデータを取り込むための便利な@XmlPath拡張機能があります。それはあなたが探しているものかもしれません。注:私はMOXyの技術リーダーです。

次の例では、単純な住所オブジェクトをGoogleの地理コード情報の表現にマッピングします。

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;

}

残りの例については、以下を参照してください。

于 2010-11-24T14:03:31.030 に答える
0

現在、いくつかのJava RADツールには、特定のDTDからのJavaコードジェネレーターが含まれているため、それらを使用できます。

于 2014-01-15T22:21:14.297 に答える