如何在XML Schema中找到其值指定为QName的所有元素?

时间:2012-03-19 13:05:50

标签: xpath xsd saxon qnames

假设......

  • 我有一个复杂的XML架构,一个导入/包含其他架构文件的架构,后者又导入/包含更多架构文件。
  • 我想找到此XML架构中具有声明为QName类型的值(即文本节点)的所有元素。
  • 我希望这些元素的位置(路径)表示为XPath语句(例如/ foo / bar)。

如果我正在编写Java应用程序,那么这项工作的技术是什么?它是XSOM之类的架构对象模型吗?是Java XPath API吗?还有别的吗?

编辑:对于那些想要在Saxon访问SCM的快速启动的人(根据Michael Kay的推荐),这里有一些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());

1 个答案:

答案 0 :(得分:0)

查询模式文档是一件难以理解的事情,因为在XSD中有很多方法可以说同样的事情:例如,命名的模型组和属性组使您的任务变得相当复杂。

如果你正在寻找从QName和QName本身派生的类型,那么它真的很难。

在某种“已编译”的模式上进行此操作比在原始模式文档上进行操作要容易得多。

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