让我们考虑以下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的应用程序.
评论?建议?
根据Michael Kay的说法,他似乎是XML世界中的重要人物.
是的,您可以假设将保留元素的顺序.XML规范的编写者没有明确地说明这一点,但那是因为他们认为这很明显.不保留顺序的解析器可能在技术上符合要求,但没有人会使用它; 许多XML应用程序依赖于保留的顺序,特别是那些使用XML来表示文档的程序.
资料来源:http://lists.xml.org/archives/xml-dev/201003/msg00045.html
我知道这已经很古老了,但尽管如此,我也在寻找一种方法来保证 XML 元素的保留顺序。
虽然当前所有解析器都可能保留顺序,但 XML 定义决不需要这样做,并且未来的解析器可能会完全不同地处理顺序。
看来目前存在的最佳解决方案是为元素赋予“id”属性,以便在解析后可以在代码中验证顺序。
当 XML 文件中的顺序已经很明显时,我讨厌必须要求我的用户添加任意 id="1"、id="2" 等,但据我所知,XML 中没有官方标准需要重复元素的特定顺序。
更新
如果您使用 .NET,它有一个属性,您可以设置它来定义读取这些元素的顺序。因此,我想只要您知道您的 XML 将在哪里进行解析,并且解析器支持强制执行元素排序按照您要求的方式,然后可以执行命令。
然而,如果第三方使用他们自己的解析器获取并尝试复制您的结果,则可能会发生混乱,因为该顺序是在其他地方配置的,而不是在 XML 中,因此没有其他解析器实现知道如何利用该顺序。
因此,这一切都可以概括为:(a) 顺序不能在 XML 规范本身内强制执行,但是 (b) 顺序可以并且经常由大量 XML 解析器强制执行。