有没有办法在XML Schema中强制/保留XML元素的顺序?

Mar*_*coS 9 xml xsd

让我们考虑以下XML Schema:

<?xml version="1.0" encoding="UTF-8"?>
<schema 
    targetNamespace="http://www.example.org/library" 
    elementFormDefault="qualified" 
    xmlns="http://www.w3.org/2001/XMLSchema" 
    xmlns:lib="http://www.example.org/library">

    <element name="library" type="lib:libraryType"></element>

    <complexType name="libraryType">
        <sequence>
            <element name="books" type="lib:booksType"></element>
        </sequence>
    </complexType>

    <complexType name="booksType">
        <sequence>
            <element name="book" type="lib:bookType" 
                     maxOccurs="unbounded" minOccurs="1"></element>
        </sequence>
    </complexType>

    <complexType name="bookType">
        <attribute name="title" type="string"></attribute>
    </complexType>
</schema>
Run Code Online (Sandbox Code Playgroud)

和相应的XML示例:

<?xml version="1.0" encoding="UTF-8"?>
<lib:library 
    xmlns:lib="http://www.example.org/library" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.example.org/library src/library.xsd ">

  <lib:books>
    <lib:book title="t1"/>
    <lib:book title="t2"/>
    <lib:book title="t3"/>
  </lib:books>

</lib:library>
Run Code Online (Sandbox Code Playgroud)

有没有办法保证<lib:book .../>元素的顺序得以保留?我想确保读取XML的任何解析器都会返回指定oder中的书籍,这首先是书籍title="t1",然后是书籍title="t2",最后是书籍title="t3".

据我所知,XML解析器不需要保留顺序.我想知道是否可以通过XML Schema强制执行此操作?对我来说,一个快速的解决方案是向元素添加index属性<lib:book .../>,并将订单保留委托给读取XML的应用程序.

评论?建议?

use*_*956 7

根据Michael Kay的说法,他似乎是XML世界中的重要人物.

是的,您可以假设将保留元素的顺序.XML规范的编写者没有明确地说明这一点,但那是因为他们认为这很明显.不保留顺序的解析器可能在技术上符合要求,但没有人会使用它; 许多XML应用程序依赖于保留的顺序,特别是那些使用XML来表示文档的程序.

资料来源:http://lists.xml.org/archives/xml-dev/201003/msg00045.html


Ben*_*Ben 2

我知道这已经很古老了,但尽管如此,我也在寻找一种方法来保证 XML 元素的保留顺序。

虽然当前所有解析器都可能保留顺序,但 XML 定义决不需要这样做,并且未来的解析器可能会完全不同地处理顺序。

看来目前存在的最佳解决方案是为元素赋予“id”属性,以便在解析后可以在代码中验证顺序。

当 XML 文件中的顺序已经很明显时,我讨厌必须要求我的用户添加任意​​ id="1"、id="2" 等,但据我所知,XML 中没有官方标准需要重复元素的特定顺序。

更新

如果您使用 .NET,它有一个属性,您可以设置它来定义读取这些元素的顺序。因此,我想只要您知道您的 XML 将在哪里进行解析,并且解析器支持强制执行元素排序按照您要求的方式,然后可以执行命令。

然而,如果第三方使用他们自己的解析器获取并尝试复制您的结果,则可能会发生混乱,因为该顺序是在其他地方配置的,而不是在 XML 中,因此没有其他解析器实现知道如何利用该顺序。

因此,这一切都可以概括为:(a) 顺序不能在 XML 规范本身内强制执行,但是 (b) 顺序可以并且经常由大量 XML 解析器强制执行。

  • 我不同意; XML 世界充满了重复元素的顺序至关重要的示例(例如 XHTML;浏览器无法以任何旧顺序呈现文章的段落)。更重要的是,如果不能假设子“&lt;element&gt;”元素的文档顺序被保留,则“&lt;sequence&gt;”的 XML 模式就会被破坏。因此,不保留重复元素顺序的解析器无法读取验证文档所需的模式。其他模式标签(如“&lt;import&gt;”和“&lt;include&gt;”)同样对顺序敏感。 (4认同)