如何用Java解析高级XML文件
我见过很多关于如何用 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>
这只是 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" );
似乎网络上的大多数示例都与此类似: http://www.easywayserver.com/blog/java-how-to-read-xml-file/
我需要帮助弄清楚当我想提取更深的标签时该怎么做或者找到一个关于读取/解析 XML 文件的好教程。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
实际上,当您调用
builder.parse(string)
时,您的解析本身就已经完成了。现在您需要了解的是如何从解析的 XML 文档中选择/查询信息。关于如何做到这一点,我同意@khachik 的观点。详细说明一下(因为没有其他人发布答案):
XPath 是提取信息最方便的方法,如果您的输入文档不是很大,XPath 就足够快了。 这里是关于 Java 中 XPath 的一个很好的入门教程。如果您需要随机访问 XML 数据(即,如果您必须以与源文档中显示的顺序不同的顺序从树中来回提取数据),也建议使用 XPath,因为 SAX 是为线性访问而设计的。
一些示例 XPath 表达式:
/*/visual_scene/@id
/*/visual_scene/node/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 更复杂。
Really, your parsing per se is already done when you call
builder.parse(string)
. What you need to know now is how to select/query information from the parsed XML document.I would agree with @khachik regarding how to do that. Elaborating a little (since no one else has posted an answer):
XPath is the most convenient way to extract information, and if your input document is not huge, XPath is fast enough. Here is a good starting tutorial on XPath in Java. XPath is also recommended if you need random access to the XML data (i.e. if you have to go back and forth extracting data from the tree in a different order than it appears in the source document), since SAX is designed for linear access.
Some sample XPath expressions:
/*/visual_scene/@id
/*/visual_scene/node/instance_geometry/@url
/*/visual_scene/node[@name = 'Sketchup']/instance_geometry/@url
/*/visual_scene/node/instance_geometry/bind_material/technique_common/instance_material/@target
Since COLLADA models can be really large, you might need to do a SAX-based filter, which will allow you to process the document in stream mode without having to keep it all in memory at once. But if your existing code to parse the XML is already performing well enough, you may not need SAX. SAX is more complicated to use for extracting specific data than XPath.
您在代码中使用 DOM。
DOM 为其解析的 xml 文件创建一个树形结构,您必须遍历该树才能获取各个节点中的信息。
在您的代码中,您所做的就是创建树表示。即
现在您应该引用 DOM api 来了解如何获取您需要的信息。
例如,此方法返回具有指定名称的所有元素的 NodeList。
现在您应该循环遍历 NodeList
免责声明:这是示例代码。没有编译过。它向您展示了这个概念。您应该研究 DOM api。
You are using DOM in your code.
DOM creates a tree structure of the xml file it parsed, and you have to traverse the tree to get the information in various nodes.
In your code all you did is create the tree representation. I.e.
Now you should reference the DOM apis to see how to get the information you need.
For instance this method returns a NodeList of all elements with the specified name.
Now you should loop over the NodeList
DISCLAIMER: This is a sample code. Have not compiled it. It shows you the concept. You should look into DOM apis.
EclipseLink JAXB (MOXy) 有一个有用的 @XmlPath 扩展,用于利用 XPath 来填充对象。这可能就是您正在寻找的。注意:我是 MOXy 技术负责人。
以下示例将简单的地址对象映射到 Google 的地理编码信息表示形式:
有关示例的其余部分,请参阅:
EclipseLink JAXB (MOXy) has a useful @XmlPath extension for leveraging XPath to populate an object. It may be what you are looking for. Note: I am the MOXy tech lead.
The following example maps a simple address object to Google's representation of geocode information:
For the rest of the example see:
如今,一些 java RAD 工具具有来自给定 DTD 的 java 代码生成器,因此您可以使用它们。
Nowadays, several java RAD tools have java code generators from given DTDs, so you can use them.