2014-09-26 55 views
0

好吧,我已经阅读栈溢出几个类似的问题和谷歌,但没有一个似乎是正确的答案我找...创建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是否已经发生了很大的变化......)

回答

0

XSD确实发生了变化,现在有一个1.1版本,允许您使用xs:所有内容,包括xs:任何通配符。但要谨慎,虽然规范已经推进,但并非所有的实施都遵循了这一点

0

我们决定我们要在我们的企业网络应用程序中建立验证。以前,我们打算将客户端指向另一个网页并要求他们使用该工具使用我们提供的.xsd来运行验证

现在,我可以在客户端的XML上运行XSLT转换,我可以在ord中首先列出所有必填字段呃我希望他们和所有可选字段位于必填字段之后,因此,看起来我现在可以运行xs:sequence并对所需字段运行验证,并忽略以下所有可选字段。我甚至不知道我将不得不执行这一步,因为在XSLT转换过程中,任何缺失的标记都可能会引发错误,并且我可以捕获错误,甚至可能不会使用.xsd文件。

这是我现在的计划。我不会在任何答案标记,直到我证实了这个作品。