针对特定xsi:type的高效XML解析

时间:2010-12-22 11:25:51

标签: java xml xpath

所有

我有一个包含以下设置的大型xml文件目录:

<io:InfoObjects xmlns:crole="http://enterprise.businessobjects.com/3.0/customrole" 
 xmlns:fo="http://enterprise.businessobjects.com/3.0/folder"  
 xmlns:io="http://enterprise.businessobjects.com/3.0/infoobject" 
 xmlns:md.dc="http://enterprise.businessobjects.com/3.0/metadata.dataconnection"  
 xmlns:un="http://enterprise.businessobjects.com/3.0/universe" 
 xmlns:wi="http://enterprise.businessobjects.com/3.0/webi" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:schemaLocation="http://enterprise.businessobjects.com/3.0/customrole BusinessObjects_CustomRole.xsd  
 http://enterprise.businessobjects.com/3.0/folder BusinessObjects_Folder.xsd 
 http://enterprise.businessobjects.com/3.0/infoobject BusinessObjects_InfoObject.xsd  
 http://enterprise.businessobjects.com/3.0/metadata.dataconnection BusinessObjects_MetaData_DataConnection.xsd 
 http://enterprise.businessobjects.com/3.0/universe BusinessObjects_Universe.xsd 
 http://enterprise.businessobjects.com/3.0/webi BusinessObjects_Webi.xsd" version="1200" illegalCharsEncoded="true">
 <io:InfoObject xsi:type="wi:Webi">
  <io:ID>1</io:ID> 
  <io:Name>MyName</io:Name>
  <io:Description>NoDesc</io:Description>
 </io:InfoObject>
</io:InfoObjects>

原始问题: (在Java 1.5中)我目前正在使用dom并解析每个节点/ elemnt,直到找到我特定类型的wi:Webi。这似乎是非常有效的,并且觉得我缺少一个Java函数,它允许我简单地提取所有类型为“wi:Webi”的元素/节点。有更简单的解决方案吗?

更新: 我开始使用XPath但是,我遇到了表达式创建的问题。到目前为止,我正在尝试:

xpath.compile("//*[@xsi:type='wi:Webi']");

根据其他类似问题的stackoverflow帖子,我需要在我的表达式中定义名称空间。我希望* [@ xsi:type]搜索会声明任何类型为wi的子节点:Webi将其返回到节点列表中。

1 个答案:

答案 0 :(得分:1)

“快速而轻盈”的效率,然后是“开发人员编写更少的代码行”效率。你最关心的是哪一个?

如果速度快,请查看SAX处理,因为如果您的要求可以满足要求,那么它的效率会被夸大。这是从DOM到SAX的精神调整,但我推荐它。

否则,如果您需要坚持使用DOM,请查看XPath以轻松提取所有匹配元素。