如何查找其值为QName的XML架构中的所有元素?

问题描述:

假设......如何查找其值为QName的XML架构中的所有元素?

  • 我有一个复杂的XML模式,一个进口/包括其他模式文件,这反过来又导入/包括更加架构文件。
  • 我想找到这个XML模式中的所有元素都有一个声明为QName类型的值(即文本节点)。
  • 我希望这些元素的位置(路径)被表示为XPath语句(例如/ foo/bar)。

如果我正在编写一个Java应用程序,那么这份工作的正确技术是什么?它是一个模式对象模型,如XSOM?是Java XPath API?还有别的吗?

编辑:对于那些谁想要在访问中撒克逊的SCM(每下面迈克尔·凯的建议)jumpstart时,这里的一些Java代码(没有异常处理):

// Load the XSD into Saxon 
Processor processor = new Processor(true); 
SchemaManager schemaManager = processor.getSchemaManager(); 
DocumentBuilder documentBuilder = processor.newDocumentBuilder(); 
SAXSource saxSource = new SAXSource(new InputSource("path/to/yourSchema.xsd")); 
XdmNode schema = documentBuilder.build(saxSource); 
schemaManager.load(saxSource); 
// Export the SCM 
XdmDestination destination = new XdmDestination(); 
schemaManager.exportComponents(destination); 
XdmNode xdmNode = destination.getXdmNode(); 
System.out.println(xdmNode.toString()); 

查询模式文档是很难找到正确的答案,因为在XSD中有很多说同一件事的方法:例如命名的模型组和属性组将使您的任务变得复杂。

如果您正在寻找从QName派生的类型以及QName本身,那么它确实非常困难。

因此,在某种“编译”模式下执行它比在原始模式文档上执行要容易得多。

使用XSOM是一种方法,虽然它没有查询功能IIRC。另一种方法是使用Saxon的SCM输出:这是以XML形式表示编译的“模式组件模型”;作为编译的模式,您不必担心xs:include,xs:redefine等所有复杂性,而使用XML则意味着您可以在其上使用XQuery。 (我会推荐XQuery而不是XPath,因为会涉及到很多连接,包括您需要用户定义的函数的递归连接。)