好的,我已经阅读了几个关于堆栈溢出和谷歌的类似问题,但似乎没有一个是我正在寻找的正确答案......
我们有几个不同的客户端为我们提供XML Feed。我们为每个客户提供一份文件,告诉他们,至少他们必须向我们提供
<id>
<name>
<updated_at>
标记其Feed中的每个子节点。基本上,我们正在努力使流程标准化。每个客户端通常会添加一堆其他可选的标记。我们检查这些标签是否存在并加载数据,如果标签不存在则忽略它们。此外,在客户端Feed中,我试图将其保持打开状态,以便他们可以按任何顺序提供带有标记的Feed ...但老实说,我开始认为我的问题的解决方案是定义的部分a&#34;标准&#34;饲料是他们以一定的顺序提供饲料。
总之...
因此,例如,我可能会为客户端A提供一个类似于此的Feed
<?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来提供给我们的客户,以便他们可以在向我们提供Feed之前根据我们的XSD验证他们的XML。目前,我们必须为每个客户定制每个Feed。
我开始学习XSD并很快发现如果我使用
<xs:all>
我可以检查所需的标签
<id>
<name>
<updated_at>
以任何顺序,但我不能使用
<xs:any processContents="skip" />
跳过所有其他可选标签。如果我使用
<xs:sequence>
我可以使用xs:any但现在我的必需标签必须按照非常不同的顺序。
使用all时,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应用于上面的客户端A的XML时,我得到了这些错误 错误 - 第8行,第19行:org.xml.sax.SAXParseException; lineNumber:8; columnNumber:19; cvc-complex-type.2.4.a:找到以元素&#39; short_name&#39;开头的无效内容。其中一个{updated_at}&#39;是期待。 每个
当我创建这个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:&#39; all&#39;的内容必须匹配(注释?,元素*)。从以下问题开始发现问题:
我尝试了很多变化而没有运气。
我能否使用XSD ???
检查下面列出的2项要求要求1.
<id>
<name>
<updated_at>
标签是必需的(我只使用了minOccurs和maxOccurs,但由于我的帖子对于我认为非常简单的要求而言已经过多了,因此我的帖子已经超出了空间,并且可以按任何顺序)。
要求2.所有其他标签都是可选的,可以忽略
如果是这样,我怎么写这个complexType ???
这对我来说似乎很简单但是,我在这里,1天后完全感到困惑。 XSD肯定比我想象的要多得多。
提前感谢您的推荐。
此外,这是我已阅读的一篇文章,其中包含与使用
相关的书签<xs:sequence>
&#34;如何忽略未知标签的验证?&#34;,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有多大变化......
答案 0 :(得分:0)
XSD确实发生了变化,现在有一个1.1版允许你使用xs:所有内容包括xs:任何通配符。但要小心;虽然规范已向前推进,但并非所有实施都遵循了这一规定。
答案 1 :(得分:0)
我们决定将验证构建到我们的企业Web应用程序中。以前,我们将客户端指向另一个网页,并要求他们使用该工具使用我们提供的.xsd运行验证。
现在,我能够在客户端的XML上运行XSLT转换。我可以按照我想要的顺序列出所有必需字段,并在所需字段之后列出所有可选字段,因此,看起来我现在可以运行xs:sequence并运行必需字段的验证并忽略以下所有选项领域。我甚至不确定我是否必须运行此步骤,因为任何丢失的标记可能会在XSLT转换期间抛出错误,我可以捕获那里的错误,甚至可能不使用.xsd文件。
这是我目前的计划。在我确认这项工作之前,我没有给任何答案留下任何答案。