如何根据仅在运行时知道的 XSD 更新 xml?

How to update xml according to XSD only known at runtime?

目标是 根据给定的 XSD 将一些元素插入到现有的 xml 文档中,作为 java 应用程序的一部分.

问题是:具体 XSD 仅在运行时已知,因此像 jaxb 这样的标准解决方案不起作用,因为它们处理 XSD在编译时已知。

我在编译时拥有的唯一结构信息是要插入的元素的结构和父元素的名称。该元素的兄弟姐妹的顺序和名称仅在运行时在 XSD 内可用。

从更高的层次来看,我会说任务可以通过以下步骤完成:

  1. 解析xml构建文档树
  2. 根据给定的XSD
  3. 确定插入元素的正确位置(<--这是难点)
  4. 插入元素
  5. 将文档写成xml

问题是第 2 步。我发现了一个类似的问题,要求解决该步骤:How to load XML tags order from XSD with Java? 但是这个问题没有答案。

我可以提出以下建议。

不要使用 JAXB。向下到 DOM。只需解析文档,在运行时根据您 XSD 对其进行验证。验证可能会抛出异常,其中包含一些有关有问题片段位置的信息。使用此信息定位 DOM 中的父节点并添加缺少的节点。

我自己没有尝试过,担心实现不会像这个简短的描述那么容易,但希望它是可行的。

所以,祝你好运。我很高兴知道你将如何解决这个问题。

您可以尝试使用 XML Schema Object Model 来确定兄弟元素之间的顺序。我在一个项目中使用它来确定子元素的基数,这在将 XML 转换为 JSON 时很重要,反之亦然。

理解它需要一些努力,但效果很好。

更新

我认为 XSOM 是 Xerces 的一部分,或者至少 Xerces 实现了 Post 架构验证信息集 (PSVI)。假设您使用架构感知解析器解析输入 XML 文档,您可以访问 PSVI 并对其进行分析。阅读更多 here.