如何查找其值为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,因为会涉及到很多连接,包括您需要用户定义的函数的递归连接。)