gpt4 book ai didi

java - 按照模式指定的顺序在序列下的 XML 中插入元素

转载 作者:数据小太阳 更新时间:2023-10-29 02:46:15 27 4
gpt4 key购买 nike

我们有大量程序将数据解析为 XML 文件。我们有大约 14 个方案,每个方案都有不同的根,由大约 60 个 XSD 文件组成。一些计划具有相似的元素,但这些计划目前每周都会进行修改。

我有一个阶段(用 Java 编写),它接受一个 XML 文件(可能对应于 14 个方案中的任何一个)并读取(xpaths,消息)的元组列表,并且对于每个 xpath,在下面插入一个标志元素由包含消息的 xpath 定义的元素。

<default:flag issueDateTime="2012-01-10T21:00:09" recipient="lablabla" resolvedIndicator="false" sender="SS" xmlns:default="default">
<default:flagSubject/>
<default:message>
<default:p>This element should be non empty</default:p>
</default:message>
</default:flag>

我目前的方法是插入标志元素作为 xpath 引用的节点的最后一个子节点,这一直是一个问题。在某些方案中,引用的节点确实按照 xsd 定义的顺序(可以是中间、第一个或最后一个)接受序列下的标志元素,因此当元素已经具有来自该序列的子元素时,将其添加为最后一个元素会使 xml 无效。

我的问题是,如何以尊重 XSD 定义顺序的方式在序列下追加元素?

我正在做这个

Element flag = rawXmlDoc.createElementNS("default", "default:flag");
xpath = factory.newXPath();
xpath.setNamespaceContext(nsContext);
XPathExpression expr = xpath.compile(xpathText);
Element refNode = (Element)expr.evaluate(rawXmlDoc, XPathConstants.NODE);
if (refNode.getNodeType()==Node.ELEMENT_NODE)
refNode.appendChild(flag);
else
refNode.getParentNode().appendChild(flag);

我希望在不依赖 MOXy 的情况下使用标准 DOM 接口(interface)得到答案。

最佳答案

为什么不使用 JAXB?当您将 JAXB 与 XJC 一起使用时,您可以

  • 从您的 XSD 文件生成 Java 类
  • 使用 JAXB 将 XML 解码为 Java 对象
  • 使用 Java 操作 XML
  • 再次使用 JAXB 将 Java 对象解码为有效的 XML

那是使用标准的 Java XML API 而不是直接使用 DOM。但是,JAXB 包含在每个 JDK 中,因此您没有额外的依赖项

关于java - 按照模式指定的顺序在序列下的 XML 中插入元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8826044/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com