我的项目的一部分涉及用户定义的架构文档的大量转换。我需要能够更改目标名称空间,支持类型交叉引用并在多个模式文档上构建wsdl
。
最常用的操作之一是在将模式导入wsdl文件之前更改名称空间前缀。我正在使用org.xml.sax.ContentHandler
和startPrefixMapping
方法来处理命名空间。除非我想改变元素类型,否则所有工作都很好而且完美无缺。
这是简单的模式片段
<schema xmlns="http://www.w3.org/2001/XMLSchema">
<complexType name="Param">
<sequence>
<element name="key" type="string"/>
<element name="value" type="string"/>
</sequence>
</complexType>
<!-- omitted -->
必须放在wsdl中,如下所示:
<definitions xmlns:xs="http://www.w3.org/2001/XMLSchema">
<types>
<xs:schema>
<xs:complexType name="Param">
<xs:sequence>
<xs:element name="key" type="xs:string"/> <!-- 'xs:' to be added -->
<xs:element name="value" type="xs:string"/> <!-- 'xs:' to be added -->
</xs:sequence>
</xs:complexType>
<!-- omitted -->
问题在于某些架构的属性值(type
中的<element>
,base
中的<extension>
)是名称空间感知的,并且在上面的示例中可能会发生变化。我可以看到,DOM和SAX解析器都无法处理这种情况,因此我目前正在使用丑陋的字符串操作从特定属性值中检索命名空间信息。
我错过了什么吗?是否有任何api,库或其他特定于架构的工具来处理这类任务?
答案 0 :(得分:3)
是的,这是xml架构/ wsdl中的一个主要错误。利用属性值中的xml名称空间前缀是一个巨大的错误(因为前缀值本身并不重要,只有实际名称空间的占位符)。不幸的是,我不知道这个问题有什么好的解决方案(我必须实现几乎相同的想法:将多个用户定义的模式合并到一个模式/ wsdl中)。我知道xerces有xml schema model api,但我不知道它是否支持将多个模式合并在一起并生成结果输出。
答案 1 :(得分:1)
SAX是用于读取模式文档的非常低级别。如果你转移到像XSLT这样的更高级别的界面,你将消除很多麻烦。如果您使用模式处理器将模式文档转换为模式组件模型来读取模式文档,那么您将删除更多麻烦 - Xerces和Saxon都可以执行此操作,并且它们并不是唯一的。