在工作中,我遇到了一个非常奇怪的结构化XML文件。我想看看这是不是真的很奇怪 - 如果它是一些我不熟悉的XML习语,它有一些我没有看到的隐藏优势。
XML文件表示嵌入式系统的参数层次结构。在XML中编码此层次结构的目的是使用XSL转换来生成代码和支持文档。这不是奇怪的部分。
假设我们有以下层次结构:
[Ethernet]
MAC
IP
[CodeType]
foo
bar
[Deeper]
bleep
bloop
[StillDeeper]
thing
[Serial]
baud
显然这不是设备中的实际层次结构;真正的一个有600多个参数。在这个图中,我只是试图了解我们有容器(方括号中的项)和参数(其他项)的想法。而且希望文件夹可以嵌套也同样显而易见。
如果我想用XML表达,我会写这样的东西:
<db>
<folder name="Ethernet">
<param name="MAC"/>
<param name="IP"/>
</folder>
<folder name="CodeType">
<param name="foo"/>
<param name="bar"/>
<folder name="Deeper">
<param name="bleep"/>
<param name="bloop"/>
<folder name="StillDeeper">
<param name="thing"/>
</folder>
</folder>
</folder>
<folder name="Serial">
<param name="baud"/>
</folder>
</db>
我敢打赌,其他大多数人都会写同样的事情。撇开XML的冗长,它与上面的文本示例几乎相同。但这并不是我正在处理的XML文件实际上是如何构建的。这是:
<item type="db" name="db">
<item type="folder" name="Ethernet">
<next>
<item type="param" name="MAC">
<next>
<item type="param" name="IP">
</item>
</next>
</item>
</next>
<sameLevelNext>
<item type="folder" name="CodeType">
<next>
<item type="param" name="foo">
<next>
<item type="param" name="bar">
<next>
<item type="folder" name="Deeper">
<next>
<item type="param" name="bleep">
<next>
<item type="param" name="bloop">
<next>
<item type="folder" name="StillDeeper">
<next>
<item type="param" name="thing">
</item>
</next>
</item>
</next>
</item>
</next>
</item>
</next>
</item>
</next>
</item>
</next>
</item>
</next>
</item>
<sameLevelNext>
<item type="folder" name="Serial">
<next>
<item type="param" name="baud">
</item>
</next>
</item>
</sameLevelNext>
</sameLevelNext>
</item>
</item>
可能不太明显,但这(基本上)是相同的数据结构。最明显的区别是,不是使用XML的内置序列和元素嵌套概念,而是看到一个奇怪的显式树结构(“next”是序列中的下一个项目,“sameLevelNext”是序列中的下一个文件夹)。
使用XSL将此XML转换为代码和文档。为了实现这一点,XSL必须以递归方式遍历“next”和“sameLevelNext”分支。它有效,但它比它需要的更痛苦。
它实际上变得更糟,但我会饶了你血淋淋的细节。一些参数值是枚举,枚举值的表示是列表,结构与上面相同,具有不同的“下一个”元素。
那么,这是否代替了序列和元素嵌套代表XML中的某些习惯用法?有没有人在XML中看到过这样的东西?我非常想把它变成一个更规范的形式并重写XSL。但如果这里潜藏着非常聪明或有用的东西,我想知道。