如何用Java解析高级XML文件

Esp*_*pen 1 java xml collada

我已经看过很多关于如何用Java读取XML文件的例子.但它们只显示简单的XML文件.例如,它们展示了如何从XML文件中提取名字和姓氏.但是,我需要从collada 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>
Run Code Online (Sandbox Code Playgroud)

这只是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" );
Run Code Online (Sandbox Code Playgroud)

似乎网络上的大多数示例与此类似:http://www.easywayserver.com/blog/java-how-to-read-xml-file/

当我想要提取更深层的标签或找到一个阅读/解析XML文件的好教程时,我需要帮助搞清楚该怎么做.

Lar*_*rsH 6

真的,你的解析本身已经在你打电话时完成了builder.parse(string).您现在需要知道的是如何从解析的XML文档中选择/查询信息.

我同意@khachik关于如何做到这一点.详细说明(因为没有其他人发布答案):

XPath是提取信息最方便的方法,如果您的输入文档不是很大,XPath足够快.是一个关于Java中XPath的好的入门教程.如果您需要随机访问XML数据,也建议使用XPath(即,如果您必须以与源文档中显示的顺序不同的顺序来回提取树中的数据),因为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.与XPath相比,SAX用于提取特定数据更复杂.