1

我需要使用一组模式对传入的 XML 片段执行一些验证。

所有这些模式共享相同的 targetNamespace,但被分成不同的 .xsd 文件。

我的 java 程序将每个 xsd 文件加载到 InputSource[] 数组中并将它们传递到 SAX Parser(SCHEMA_SOURCE 属性)。但是,当调用 XMLReader.parse 方法时,我得到以下堆栈跟踪:

** java.lang.IllegalArgumentException:当使用对象数组作为 SCHEMA_SOURCE 属性的值时,没有两个 Schema 应该共享相同的 targetNamespace。在 org.apache.xerces.impl.xs.XMLSchemaLoader.processJAXPSchemaSource(Unknown Source) 在 org.apache.xerces.impl.xs.XMLSchemaLoader.loadSchema(Unknown Source) 在 org.apache.xerces.impl.xs.XMLSchemaValidator.findSchemaGrammar (未知来源)在 org.apache.xerces.impl.xs.XMLSchemaValidator.handleStartElement(未知来源)在 org.apache.xerces.impl.xs.XMLSchemaValidator.startElement(未知来源)在 org.apache.xerces.impl.XMLNSDocumentScannerImpl .scanStartElement(Unknown Source) at org.apache.xerces.impl.XMLNSDocumentScannerImpl$NSContentDispatcher.scanRootElementHook(Unknown Source) at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher。

我需要使用共享命名空间的模式来解析 XML。是否可以这样做并避免上述错误?

任何形式的帮助或建议将不胜感激

谢谢

4

1 回答 1

0

不,这是不可能的。它由XML 和模式规范强制执行。

实体或属性只能与单个命名空间相关联,可以是默认的隐式命名空间,也可以是显式命名空间作为前缀。

一个建议:如果您的 XML 输入格式正确但由于没有声明命名空间而无法验证,但您知道如何实现一个逻辑,该逻辑可以根据每个节点的上下文(如其前一个节点或其前一个节点)猜测每个节点的命名空间是什么父节点。您可以创建一个预处理器:

  • 将 XML 输入节点解析为 DOM(甚至使用 SAXParser)而不进行模式验证
  • 应用这样的逻辑并使用猜测的命名空间预先挂起实体和/或属性
  • 再次输出为 XML;在该步骤中,您可以选择使用漂亮的格式化程序进行调试
  • 现在通过模式验证将该输出注入现有的解析器
于 2012-02-15T12:03:19.153 回答