在不更改属性顺序的情况下获取 XML

Posted

技术标签:

【中文标题】在不更改属性顺序的情况下获取 XML【英文标题】:Fetching the XML without changing the order of the attributes 【发布时间】:2019-01-03 10:18:24 【问题描述】:

我正在尝试从文件中获取 xml,但是在获取属性的顺序时正在改变 我知道这无关紧要,但在我的情况下它确实如此,因为我正在散列文档

我正在尝试下面的代码,但它按字母顺序排列属性

File fXmlFile = new File("C:\\Users\\Desktop\\abc.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder;
dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
DOMSource domSource = new DOMSource(doc);
StringWriter writer = new StringWriter();
StreamResult result = new StreamResult(writer);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.transform(domSource, result);
String xml=writer.toString();

这是我要阅读的 xml 在变量 xml 中,我得到的 xml 具有按字母顺序排序的属性

【问题讨论】:

当您以固定顺序获取属性时,这意味着您可以为结构相同的 XML 生成哈希值。但是,它不会检测到具有移动属性的相等 XML。那么为什么不对文件本身进行哈希处理呢?空白?对于 XML,您可能会尝试使用拉式解析器。 @JoopEggen 我实际上想从该 xml 中获取一个属性,将其存储,从 xml 中删除该属性,然后对其进行哈希处理 这意味着您需要文档内容模型的哈希,而不仅仅是文件。为此,您需要计算它们的规范形式(无论哪种类型最适合您),然后计算它的哈希值。他们通过列出按名称排序的属性来解决您描述的问题。 会试试这个并更新 【参考方案1】:

属性顺序在 XML 中没有意义,处理 XML 的工具可以随意更改顺序。

当您比较文档的等价性时(您似乎正在这样做),那么您应该使用不依赖于属性顺序的比较和哈希函数。

【讨论】:

会试试这个。谢谢。

以上是关于在不更改属性顺序的情况下获取 XML的主要内容,如果未能解决你的问题,请参考以下文章

JAXB XML;如何在不需要创建元素的 pojo 的情况下获取元素的属性?

保留 XML 属性顺序?

如何在不更改顺序的情况下从 plist 加载数据

在不更改值顺序的情况下重新排序因子的级别

在不更改架构的情况下保持 XML DRY

我可以在不更改项目顺序的情况下将 JSON 字符串转换为 Flex ArrayCollection 吗?