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并不遵循模式,但至少现在我有一些东西需要测试。
答案 0 :(得分:20)
我知道这已经过时了,但我刚刚接受了这个职位。
直到今天,我很可能会使用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连接它们。