0

假设...

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

如果我正在编写 Java 应用程序,那么适合这项工作的技术是什么?它是像XSOM这样的模式对象模型吗?是Java XPath API吗?还有什么?

编辑:对于那些想要快速开始访问撒克逊 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());
4

1 回答 1

0

查询模式文档是一件很难做到的事情,因为在 XSD 中有很多表达同一件事的方式:例如命名模型组和属性组会使您的任务相当复杂。

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

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

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

于 2012-03-19T15:23:46.417 回答