好吧,我已经阅读栈溢出几个类似的问题和谷歌,但没有一个似乎是正确的答案我找...创建XSD只检查特定的标记以任何顺序
我们有几个为我们提供XML Feed的不同客户端。我们为每一位客户提供一份文件,告诉他们至少必须向其提供每个子节点中的
<id>
<name>
<updated_at>
标签。基本上,我们正在努力将流程标准化。每个客户端通常会添加一堆其他可选标签。我们检查这些标签是否存在并加载数据,如果标签不存在则忽略它们。另外,在客户端Feed中,我试图让它打开,以便他们可以按照任何顺序传递他们的提要与标签...但老实说,我开始认为我的问题的解决方案是定义的一部分一个“标准”饲料是为了他们按照一定的顺序提供饲料。
反正...
所以,举例来说,我可能有一个饲料看起来像这样的客户端A
<?xml version="1.0" encoding="UTF-8"?>
<location>
<id>10794</id>
<name>Location Name 1</name>
<short_name>Short Name for Location 1</short_name>
<description>blah blah blah blah lots of test here</description>
<image>http://www.myimage.com/wp-content/uploads/2013/05/location1.jpg</image>
<customattr1>30.3348048</customattr1>
<customattr2>-81.6671269</customattr2>
<updated_at>Mon, 03 Feb 2014 19:53:27 +0000</updated_at>
</location>
<location>
<id>96</id>
<name>Location 2</name>
<short_name>Location 2 Short Name</short_name>
<description>more long text for the description</description>
<image>http://www.myimage.com/wp-content/uploads/2011/08/location2.jpg</image>
<customattr1>30.3250000</customattr1>
<customattr2>-81.6624480</customattr2>
<updated_at>Mon, 03 Feb 2014 19:53:27 +0000</updated_at>
</location>
<location>
....
</location>
etc...
</locations>
而且,然后客户端B可能提供我们的饲料像
<?xml version="1.0" encoding="UTF-8"?>
<location>
<id>10794</id>
<name>Location Name 1</name>
<short_name>Short Name for Location 1</short_name>
<description>blah blah blah blah lots of test here</description>
<updated_at>Mon, 03 Feb 2014 19:53:27 +0000</updated_at>
<image>http://www.myimage.com/wp-content/uploads/2013/05/location1.jpg</image>
</location>
<location>
<id>96</id>
<name>Location 2</name>
<short_name>Location 2 Short Name</short_name>
<description>more long text for the description</description>
<updated_at>Mon, 03 Feb 2014 19:53:27 +0000</updated_at>
<image>http://www.myimage.com/wp-content/uploads/2013/05/location1.jpg</image>
</location>
<location>
....
</location>
etc...
</locations>
所以,我一直负责编写一个XSD提供给我们的客户,使他们能够为我们提供饲料之前验证他们对我们的XSD XML。目前,我们必须为每个客户定制每个Feed。
我开始学习XSD和很快发现,如果我用
<xs:all>
我可以检查所需要的标签
<id>
<name>
<updated_at>
以任何顺序
,但我不能使用
<xs:any processContents="skip" />
跳过所有其他可选标签。如果我使用
<xs:sequence>
我可以使用xs:any,但现在我所需的标签必须以非常不同的顺序排列。
当使用所有的XSD验证就好了,
<xs:all>
<xs:element name="id" type="xs:string"/>
<xs:element name="name" type="xs:string"/>
<xs:element name="updated_at" type="xs:string"/>
</xs:all>
,但是,当我申请了XSD到XML客户端A以上,我得到这些错误 错误 - 8号线,19:组织。 xml.sax.SAXParseException; lineNumber:8; columnNumber:19; cvc-complex-type.2.4.a:找到以元素“short_name”开头的无效内容。预计会有'{updated_at}'之一。 每个
当我创建这个XSD
<xs:all>
<xs:element name="id" type="xs:string"/>
<xs:element name="name" type="xs:string"/>
<xs:element name="updated_at" type="xs:string"/>
<xs:any processContents="skip" />
</xs:all>
的XSD甚至不进行验证,我得到这个错误 无效。 错误 - 行12,39:org.xml.sax.SAXParseException; lineNumber:12; columnNumber:39; s4s-elt-must-match.1:'all'的内容必须匹配(annotation?,element *)。发现问题始于:any。
我已经尝试了许多变化,没有运气。
我能否使用XSD检查下面列出的2个要求?
要求1.
<id>
<name>
<updated_at>
标记是必需的(一次且仅一次,我使用minOccurs和maxOccurs但上面的剩余空间了,因为我的岗位似乎已经过度了什么,我认为是一个非常简单的要求),并且可以以任何顺序。
要求2.所有其他标签是可选的,可以忽略不计
如果是这样,在世界上我怎么写复杂类型???
这对我来说似乎很简单,但在这里,我在一天后完全困惑。 XSD肯定比我想象的要多得多。
在此先感谢您的建议。
此外,这是一个文章我已阅读和书签与使用
<xs:sequence>
“如何忽略未知标签的验证?” How to ignore the validation of Unknown tags?,所以我不认为序列是连一个可行的选择为我的方案。
我读这篇文章,以及,XML Elements in Any Order, Some Required and Others Aren't,问题是我的可选标记的数量从客户不同客户......我没有可选标记的确切数量,可能是0,可能是6
这篇文章是最接近我所寻找的,How can I create a schema which requires certain elements, allows others, and is order-agnostic?。四岁; o((想知道XSD是否已经发生了很大的变化......)