XML关心元素的顺序吗?

时间:2010-12-01 20:37:03

标签: xml xsd

XML有时会让我感到困惑,但我正试图解决这个问题。供应商告诉我的内容没有意义,但是,我和XML并不相处:)

我有一些XML,我发送给供应商的网络服务,给我随机的失败:

<root>
    <Request>
        <Driver id="1" VehId="1">...</Driver>
        <Driver id="2" VehId="1">...</Driver>
        <Driver id="3" VehId="2">...</Driver>
        <Vehicle id="1">...</Vehicle>
        <Vehicle id="2">...</Vehicle>
        <Driver id="4" VehId="2">...</Driver>
    </Request>
</root>

没有要比较的XSLT或XSD,以查看我的XML是否有效。

供应商声明XML无效,因为Driver#4位于错误的区域。驱动程序的XPath应该是root / Request / Driver,Vehicle是root / Request / Vehicle。

XML解析器是否会强制执行元素顺序,尤其是在没有XSD来比较XML的情况下?供应商对我的支持很慢,所以我想知道什么是好的常规做法。

跟进

我抱怨我们的帐户代表无法测试这个(并且听起来好像他们只是想获得支持资金),事实证明开发人员拥有XSD,但支持却没有。所以我一直在和错误的小组交谈* facepalm *

我获得了XSD,它确实强制执行特定的元素顺序。

现在就他们自己的样本来对抗他们XML并不遵循模式,但至少现在我有一些东西需要测试。

7 个答案:

答案 0 :(得分:20)

XML模式合成器&#34;序列&#34;将强制执行订购

我知道这已经过时了,但我刚刚接受了这个职位。

直到今天,我很可能会使用No, unless you use a poorly written xml parser.

回答问题XSD

但是,今天第三方应用程序抱怨我创建的xml文件无效。他们使用<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:complexType name="ComplexType"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="1" default="" name="Value1" type="xs:string" /> <xs:element minOccurs="0" maxOccurs="1" default="" name="Value2" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:schema> 文件来验证xml。是的,您可以在xsd文件中强制执行一个或多个元素:

sequence

关键字为xs:sequence

  

sequence元素指定子元素必须出现在   一个序列。每个子元素可以从0到任意数量出现   次。

xs:all形成对比,后者不关心顺序,只允许出现零或一次的元素。

  

指定子元素可以按任何顺序出现。每个子元素可以出现0或1次

(单词all和{{1}}都是XML Schema定义中的Compositor。)

答案 1 :(得分:19)

如果手边没有XSD(XML架构),那么您可以检查的是XML是否格式正确。

在你的情况下 - 它是。没有重叠的XML标签,没有打开的XML标签或任何类型的标签。

如果供应商需要在XML中强制执行命令,那么他应该提供XSD文件 - 否则,他的“要求”无法验证和检查....

答案 2 :(得分:3)

供应商将会做他们将要做的事情,但这是依赖于订购的XML的非标准应用。

XML是声明性的,而不是程序性的。所以,它不应该是“逐步的”。

答案 3 :(得分:3)

XML模式可以强制执行元素顺序。如果没有架构,理论上无论是顺序也不是标签,也不是一般结构,不是文本的类型(如果它是数字或任何东西)。当然,情况并非如此。

完全有可能从XML解析*数据而不关心顺序,但它可以更容易(例如,当使用SAX时,我想,或者当你是一个懒惰的混蛋编写非常草率的代码时)解析如果你假设一定的顺序。虽然他们应该包含一些架构,如果他们想要一个特定的顺序,它们的解析器完全可能会扼杀它。是的,他们不应该这样做,但显然他们不在乎。

*通过“解析”我并不是指“将XML文档转换为例如DOM”,而是“将其视为DOM,并从中提取信息”。

答案 4 :(得分:2)

XML架构可能会也可能不会强制执行元素顺序。这取决于有问题的架构。在最一般意义上,XML元素顺序无关紧要,除非相应的模式另有规定。

答案 5 :(得分:2)

通过DOM访问XML可以按照XML文档中的方式保留节点的顺序。看这里:

http://www.w3schools.com/dom/dom_nodes_nodelist.asp

你找到了:

  

节点列表对象表示列表   节点的顺序与节中的顺序相同   XML。

如果您的网络服务依赖,则订单是一个不同的问题 - 它可能会也可能不会,这取决于Web服务的实施。

答案 6 :(得分:0)

我认为最好的答案是 - 问问他们。他们甚至可以将您的XML解析为文本文件,因此您可能需要使用换行符和一些“正确”的属性顺序。

如果他们会正确解析这个顺序无关紧要(至少不是有效请求)。我认为它们应该构建两个表并使用提供的ID连接它们。

相关问题