如何根据运行时才知道的XSD更新xml



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

问题是:具体的XSD只在运行时已知,所以像jaxb这样的标准解决方案不起作用,因为它们处理在编译时已知的XSD。我在编译时仅有的结构信息是要插入的元素的结构和父元素的名称。该元素的兄弟元素的顺序和名称仅在运行时在XSD中可用。

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

  1. 解析xml构建文档树
  2. 根据给定的XSD
  3. 确定插入元素的正确位置(<—这是困难的部分>)插入元素
  4. 将文档写入xml

问题出在第二步。我发现了一个类似的问题,询问该步骤的解决方案:如何用Java从XSD加载XML标记?但是这个问题没有答案

您可以尝试使用XML模式对象模型来确定兄弟元素之间的顺序。我在一个项目中使用它来确定子元素的基数,这在将XML转换为JSON或反之亦然时非常重要。

理解它需要一些努力,但它工作得很好。

我认为XSOM是Xerces的一部分,或者至少Xerces实现了后模式验证信息集(PSVI)。假设您使用模式感知解析器解析输入XML文档,那么您可以访问PSVI并对其进行分析。

我的建议如下:

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

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

祝你好运。我很想知道你将如何解决这个问题。

最新更新