gpt4 book ai didi

java - 操纵 XML 元素属性的顺序

转载 作者:行者123 更新时间:2023-11-30 09:23:27 27 4
gpt4 key购买 nike

我读过许多帖子,其中人们询问有关对 XML 元素强制执行某些属性顺序的问题,一般的回答是这不合法/必需/不允许/相关/其他。

我不是在寻找任何说我不应该关心属性顺序的回复,所以如果这是你的观点,请不要回复。

我有一个真正的问题需要解决。某大型企业产品在其产品的最新版本中将以下两个元素视为不同

<objquestion allowmultiple="true" id="7432" idtext="7433" idvar="7429" parent="7430" questiontype="multchoice">

<objquestion id="7432" idtext="7433" idvar="7429" parent="7430" questiontype="multchoice" allowmultiple="true">

特别是,如果“allowmultiple”属性在“questiontype”之后,它充当问题类型的修饰符。如果是之前,它会被忽略 - 它不应该被忽略。

因此,他们不太可能在短期内修复他们的产品。

我正在使用

操作此 XML 内容
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
doc = dbf.newDocumentBuilder().parse(new InputSource(path));

并且内部实现会对DOM节点图中的属性进行排序。当它被写回文件时,它会按照现在排序的顺序写入属性。我有很多代码使用 XPath 处理文档对象。

当我完成对文档的操作后,我现在用

将其写回
Transformer xformer = TransformerFactory.newInstance().newTransformer();
xformer.transform(new DOMSource(lc.getDocument()), new StreamResult(new File(paths[1])));

我需要做的是确保在问题类型之后写入 allowmultiple 属性。

我试图了解我是否可以影响用于写回 DOM 树的序列化,或者我是否可以简单地替换一个最初不将属性解析为排序映射的不同实现。我想两者都可以,但我一直无法找到如何做到这一点。

我查看了 LSSerializer,但不确定如何拦截该特定元素。我是否必须扩展 FileOutputStream 并寻找一些东西?

我读到 SAX 可能不会进行初始排序,但我需要能够在没有太多新代码的情况下放入解析器,并且我对整个 XML 世界不是那么强大。

谁能推荐一种方法来做到这一点?

最佳答案

下一个 Saxon 版本(9.5,即将发布)有一个序列化属性,允许您控制属性顺序。它是为合法用例添加的(例如,它可以提高人类的可读性,让 id 属性始终放在第一位),我有点遗憾它最终会被用于像你这样的用例,这些用例是由于大公司雇用的程序员,但就这样吧:如果它解决了问题,我不会哭。

关于java - 操纵 XML 元素属性的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16029523/

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