XML中的显式树

时间:2016-11-18 23:26:04

标签: xml

在工作中,我遇到了一个非常奇怪的结构化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。但如果这里潜藏着非常聪明或有用的东西,我想知道。

0 个答案:

没有答案