2010-12-01 100 views
20

XML有时让我困惑,但我试图弄清楚这一点。供应商告诉我什么没有意义,但再次,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> 

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

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

XML解析器是否会强制执行元素顺序很常见,特别是如果没有XSD来比较XML?供应商的支持对我而言很慢,所以我想知道通用的做法是什么。

跟进

我足够的抱怨我们的客户代表约不能够进行测试(并使其听起来像他们只是想获得支持资金),它原来,开发商拥有XSD ,但支持不。所以,我一直在谈论到错误组*捂脸*

我得到了XSD,它也执行元素特定的顺序。

我们打他们的问候自己的示例XML不遵循此模式,但至少现在我有话要测试的。

+1

供应商应提供XSD或支持文档,详细说明软件对XML格式(包括元素顺序)所做的假设。否则,你必须猜测。读取XML文档的软件不应强制执行命令(如果可能),但这种情况并不少见。 XSD *是*明确定义交换格式规则的文档。另见http://kettle.pentaho.com/。 – 2010-12-01 20:56:04

回答

16

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

在你的情况 - 这是。没有重叠的XML标签,没有保留开放的XML标签或任何类型的标签。

如果供应商需要加强的东西象XML的秩序,他应该提供一个XSD文件 - 否则,他的“要求”不能验证,并检查....

+1

这正是我的想法,我想确定。我们构建的XML解析器适用于上述XML,并且不会产生任何错误,但是如果没有XSD,您怎么能确定? – dragonmantank 2010-12-01 21:09:59

+1

DTD(如果供应商使用的是古老的工具集)也可以确定有效性。 – brianary 2013-01-09 21:43:52

2

XML模式可能会或可能不会执行元素顺序。这取决于所讨论的模式。从一般意义上讲,XML元素顺序无关紧要,除非适当的模式另有规定。

3

厂商会做什么,他们会但是,它依赖于排序是XML的非标准应用程序。

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

3

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

完全可以从XML解析*数据而不关心顺序,但它可以更容易(例如,当使用SAX时,我想象,或者当你是一个懒惰的混蛋编写非常草率的代码)解析你是否假定一定的顺序。虽然他们如果他们想要一个特定的顺序,包括一些架构,他们的解析器无论如何扼杀它是完全可能的。是的,他们不应该这样做,但显然他们不在乎。通过“解析”我并不是指“将该XML文档转换为例如DOM”,而是“取出该DOM,并从中提取信息”。

2

通过DOM访问XML保留了XML文档中节点的顺序。看看这里:

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

那里你会发现:

节点列表对象表示作为 XML节点列表 ,以相同的顺序。

如果你的Web服务是依托的顺序是一个不同的问题 - 它可能会或可能不会,这取决于Web服务实现。

0

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

如果他们会解析正确的顺序并不重要(至少不是有效的请求方面)。正如我所看到的,他们应该建立两张桌子,并用提供的ID加入他们。

11

我知道这是旧的,但我刚刚发布的帖子。

直到今天,我很可能会回答与No, unless you use a poorly written xml parser

然而问题Does XML care about the order of elements,今天第三方应用抱怨我创建的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> 

的关键词是xs:sequence

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

这与xs:all不同,它不关心顺序但只允许出现零或一次的元素。

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

相关问题