【发布时间】:2011-12-05 12:33:00
【问题描述】:
我有一个旧文件格式,我将其转换为 XML 进行处理。结构可以概括为:
<A>
<A01>X</A01>
<A02>Y</A02>
<A03>Z</A03>
</A>
标签的数字部分可以从 01 到 99,并且可能会有空格。作为处理的一部分,某些记录可能会添加额外的标签。处理完成后,我通过遍历树将文件转换回旧格式。这些文件相当大(约 150,000 个节点)。
这样做的一个问题是,一些使用旧格式的软件假定标签(或者更确切地说是转换时的字段)将按字母数字顺序排列,但默认情况下新标签将添加到分支,然后导致它们以错误的顺序从迭代器中出来。
每次我添加新标签时,我都可以使用 xpath 根据标签名称查找前面的同级,但我的问题是是否有更简单的方法在导出之前立即对树进行排序?
编辑:
我想我已经过度总结了结构。
一个记录可以包含多个级别,如上所述:
<X>
<X01>1</X01>
<X02>2</X02>
<X03>3</X03>
<A>
<A01>X</A01>
<A02>Y</A02>
<A03>Z</A03>
</A>
<B>
<B01>Z</B02>
<B02>X</B02>
<B03>C</B03>
</B>
</X>
【问题讨论】:
-
我不太确定 XML 模式是否经过深思熟虑。 A01和A02不是同一种东西吗?它们应该共享相同的元素名称。数字可能应该是一个属性,而不是标签名称的一部分。此外,标签名称当然应该比这更易读,但我意识到它们可能只是一个示例。
-
不幸的是,我无法控制旧格式,这是它如何将数据存储在键/值对中的直接翻译。在原始文件中,它可能会显示“A01=Bob”,然后应用程序就会知道该数字包含名字。
-
有很多方法可以在 XML 中实现这一点,但您在此处展示的方法并不是非常语义化的翻译。您的架构将是复杂且不断变化的。我建议
<item key="A01">value</item>其中 item 是 A01, A02 代表的东西。 -
当我说键/值对时,我的意思是一个静态的键列表,这些键已知意味着什么 - 所以它说
<A01>Bob<A01>它实际上是在说<Forename>Bob</Forename>但只是遗留应用程序(约 20 岁)是用这些不透明的数字字段名称编写的。