xml - 如何使用 JAXB 和不同但兼容的上下文解码 XML 文档

标签 xml replace namespaces jaxb

我正在尝试编写一个转换工具,该工具采用旧的 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/

相关文章:

batch-file - 用空格替换文件夹名称中的点的批处理脚本

javascript - 从文本中剥离标签(在 React JS 中)

python - 在 python 中更改字符串的特定部分

c++ - 使用 Boost Python 有条件地添加模块

c# - C#中不同窗体之间的访问数据控件

java - Rest 模板 :Could not extract response: no suitable HttpMessageConverter found for response type when we got xml response, 未绑定(bind)到 JAVA 对象

c# - 是否可以使用 XML 查询命令转储 MySQL 数据库?

java开源从xml生成sql查询

c++ - 在 C++ 中使用#define 宏从不同的命名空间中选择实现

带有命名空间的 PHP 自动加载不加载文件