gpt4 book ai didi

JAVA:如何使用具有相同目标命名空间的多个模式的 xerces SAXParser

转载 作者:行者123 更新时间:2023-12-01 05:57:28 25 4
gpt4 key购买 nike

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

所有这些架构共享相同的 targetNamespace,但分为不同的 .xsd 文件。

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

**java.lang.IllegalArgumentException:当使用对象数组作为 SCHEMA_SOURCE 属性的值时,两个模式不应共享相同的 targetNamespace。 在 org.apache.xerces.impl.xs.XMLSchemaLoader.processJAXPSchemaSource(来源未知) 在 org.apache.xerces.impl.xs.XMLSchemaLoader.loadSchema(来源未知) 在 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(来源未知) 在 org.apache.xerces.impl.XMLNSDocumentScannerImpl$NSContentDispatcher.scanRootElementHook(来源未知) 在 org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(来源未知) 在 org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(来源未知) 在 org.apache.xerces.parsers.XML11Configuration.parse(来源未知) 在 org.apache.xerces.parsers.XML11Configuration.parse(来源未知) 在 org.apache.xerces.parsers.XMLParser.parse(来源未知) 在 org.apache.xerces.parsers.AbstractSAXParser.parse(来源未知)**

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

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

谢谢

最佳答案

不,这是不可能的。由 XML and schema specification 强制执行.

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

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

  • 将 XML 输入节点解析为 DOM(甚至使用 SAXParser),无需架构验证
  • 应用这样的逻辑并在实体和/或属性之前添加猜测的命名空间
  • 再次以 XML 形式输出;在此步骤中,您可以选择使用漂亮的格式化程序来进行调试
  • 现在通过架构验证将该输出注入(inject)到现有解析器中

关于JAVA:如何使用具有相同目标命名空间的多个模式的 xerces SAXParser,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2432805/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com