我正在尝试编写一个转换工具,该工具采用旧的 XML 文档(遵循 oldSchema.xsd)并将其转换为新的 XML 格式(遵循 newSchema.xsd)。
或许我的想法完全错误,但第一步是创建一个中间模式,新旧 XML 文档都对其进行验证。例如,假设我有一个 XML 文档
<Doc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="old oldSchema.xsd" xmlns="old">
<OldElement/>
</Doc>
我想把它转换成
<Doc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="new newSchema.xsd" xmlns="new">
<NewElement/>
</Doc>
oldSchema.xsd 将 Doc 定义为一个序列,其中包含一个名为 OldElement 的必需元素。 newSchema.xsd 将 Doc 定义为一个具有称为 NewElement 的必需元素的序列。我的中间模式有一个可以选择 OldElement 或 NewElement 的序列。
显然,这里还有更多内容需要我以编程方式处理。在解码 OldElement XML 文件之前,我需要用我的中间命名空间替换命名空间“old”,以便我可以使用由我的中间上下文创建的 JAXB 实例。
这可能吗?我尝试实现我自己的
XMLStreamReader
代表XMLInputFactory.newInstance().createXMLStreamReader()
适用于除 getNamespaceURI(*)
之外的所有方法.对于这些,我实现了诸如public String getNamespaceURI() {
String existingNS = delegate.getNamespaceURI();
return subs.get(existingNS) == null ? existingNS : subs.get(existingNS)
}
在上面的示例中,subs 会将命名空间“old”映射到命名空间“new”。我对所有人重复了这一点
getNamespaceURI(*)
XMLStreamReader 中的方法。然后我传递了我的 NamespaceSubstitutionXMLReader
的一个实例至 unmarshaller.unmarshal(XMLStreamReader)
.解码的对象树有一个正确类型的根节点,但它的所有子元素都为空。我不太明白为什么这种方法不起作用,但话说回来,我真的对 Unmarshaller 实现一点也不熟悉。任何帮助是极大的赞赏。
最佳答案
我领EclipseLink JAXB (MOXy) ,但如果您只想转换 XML,我建议使用 XSLT 和 javax.xml.transform蜜蜂。
关于xml - 如何使用 JAXB 和不同但兼容的上下文解码 XML 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5174752/