XML有时会让我感到困惑,但我正试图解决这个问题.供应商告诉我的内容没有意义但是,我和XML并不相处:)
我有一些XML,我发送给供应商的Web服务,给我随机的失败:
<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>
Run Code Online (Sandbox Code Playgroud)
没有要比较的XSLT或XSD,以查看我的XML是否有效.
供应商声明XML无效,因为Driver#4位于错误的区域.驱动程序的XPath应该是root/Request/Driver,Vehicle是root/Request/Vehicle.
XML解析器是否会强制执行元素顺序,特别是如果没有XSD来比较XML?供应商对我的支持很慢,所以我想知道什么是好的常见做法.
跟进
我抱怨我们的帐户代表不能测试这个(并且听起来好像他们只是想获得支持资金),事实证明开发人员有XSD,但支持没有.所以我一直在和错误的小组交谈*facepalm*
我得到了XSD,它确实强制执行特定的元素顺序.
现在就他们自己的样本XML来对抗它们并不遵循模式,但至少现在我有一些东西需要测试.
Jür*_*ock 27
我知道这已经老了,但我刚刚上了帖子.
直到今天,我将最有可能回答这个问题Does XML care about the order of elements?有No, unless you use a poorly written xml parser.
但是,今天第三方应用程序抱怨我创建的xml文件无效.他们使用XSD文件来验证xml.是的,您可以在xsd文件中强制执行一个或多个元素:
<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>
Run Code Online (Sandbox Code Playgroud)
关键字是 xs:sequence
sequence元素指定子元素必须出现在序列中.每个子元素可以从0到任意次出现.
与此相反,xs:all它不关心顺序,只允许出现零或一次的元素.
指定子元素可以按任何顺序出现.每个子元素可以出现0或1次
(单词sequence并且all都是XML Schema定义中的Compositor.)
mar*_*c_s 19
如果手边没有XSD(XML模式),那么您可以检查的是XML是否格式正确.
在你的情况下 - 它是.没有重叠的XML标记,没有打开的XML标记或任何类型的XML标记.
如果供应商需要在XML中强制执行命令,那么他应该提供XSD文件 - 否则,他的"要求"无法验证和检查....
供应商会做他们会做的事情,但依赖排序是 XML 的非标准应用。
XML 是声明性的,而不是过程性的。所以,不应该是“循序渐进”。
小智 5
XML 模式可以强制执行元素顺序。如果没有模式,则无论是顺序、标签还是一般结构,都不是文本类型(如果它是数字或任何东西)在理论上以任何方式规定。当然,这里的情况并非如此。
完全可以在不关心顺序的情况下从 XML 解析*数据,但是如果您假设某种顺序,则解析可能会更容易(例如,我想,当使用 SAX 时,或者当您是一个编写非常草率的代码的懒惰混蛋时) 。尽管如果他们想要某种顺序,他们应该包含一些模式,但他们的解析器很可能会被它阻塞。是的,他们不应该这样做,但显然他们不在乎。
*我所说的“解析”并不是指“获取该 XML 文档并将其转换为 DOM”,而是“获取该 DOM 并从中提取信息”。