JAVA:如何使用具有相同目标命名空间的多个模式的 xerces SAXParser
我需要使用一组模式对传入的 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。是否可以这样做并避免上述错误?
任何形式的帮助或建议将不胜感激
谢谢
I have a requirement to perform some validation on an incoming piece of XML using a group of schemas.
All these schemas share the same targetNamespace but are separated into different .xsd files.
My java program is loading each xsd file into an InputSource[] array and passing them into the SAX Parser (SCHEMA_SOURCE property).
However, when calling the XMLReader.parse method, I get the following stack trace:
**
java.lang.IllegalArgumentException: When using array of Objects as the value of SCHEMA_SOURCE property , no two Schemas should share the same targetNamespace.
at org.apache.xerces.impl.xs.XMLSchemaLoader.processJAXPSchemaSource(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaLoader.loadSchema(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaValidator.findSchemaGrammar(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaValidator.handleStartElement(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaValidator.startElement(Unknown Source)
at 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.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
**
I need to parse the XML using schemas that share a namespace. Is it possible to do this and avoid the above error?
Any form of help or advice will be appreciated
Thanks
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
不,这是不可能的。它由 XML 和架构规范强制执行。
实体或属性只能与单个名称空间关联,可以是隐式的默认名称空间,也可以是作为前缀的显式名称空间。
建议:如果您的 XML 输入格式正确,但由于没有声明命名空间而无法验证,但您知道如何实现一个逻辑,该逻辑可以根据每个节点的名称空间猜测其名称空间是什么上下文就像它的前一个节点或其父节点。您可以创建一个预处理器:
No it is not possible. It is enforced by XML and schema specification.
An entity or an attribute can only be associated with a single namespace, either the default one which is implicit, either an explicit namespace as prefix.
An advice: if your XML input is well-formed but cannot be validated because no namespaces are declared but you have an idea how to implement a logic that can guess what the namespace is for each node based on its context like its previous node or its parent node. You may create a pre-processor: