XML模式:我可以创建一些属性';是否需要s值,但仍允许其他值?
(注意:我无法更改收到的XML的结构。我只能更改验证它的方式。) 假设我可以得到如下XML:XML模式:我可以创建一些属性';是否需要s值,但仍允许其他值?,xml,schema,xsd,Xml,Schema,Xsd,(注意:我无法更改收到的XML的结构。我只能更改验证它的方式。) 假设我可以得到如下XML: <Address Field="Street" Value="123 Main"/> <Address Field="StreetPartTwo" Value="Unit B"/> <Address Field="State" Value="CO"/> <Address Field="Zip" Value="80020"/> <Address Fie
<Address Field="Street" Value="123 Main"/>
<Address Field="StreetPartTwo" Value="Unit B"/>
<Address Field="State" Value="CO"/>
<Address Field="Zip" Value="80020"/>
<Address Field="SomeOtherCrazyValue" Value="Foo"/>
<xs:element name="Address" type="addressType" maxOccurs="unbounded" minOccurs="3"/>
<xs:complexType name="addressType">
<xs:attribute name="Field" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Street"/>
<xs:enumeration value="State"/>
<xs:enumeration value="Zip"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
我需要创建一个XSD模式来验证“Street”、“State”和“Zip”必须存在。但我不在乎“StreetPartTwo”和/或“SomeOtherCrazyValue”是否也出现
如果我知道只有我关心的三个可以包括在内(并且每个只能包括一次),我可以这样做:
<Address Field="Street" Value="123 Main"/>
<Address Field="StreetPartTwo" Value="Unit B"/>
<Address Field="State" Value="CO"/>
<Address Field="Zip" Value="80020"/>
<Address Field="SomeOtherCrazyValue" Value="Foo"/>
<xs:element name="Address" type="addressType" maxOccurs="unbounded" minOccurs="3"/>
<xs:complexType name="addressType">
<xs:attribute name="Field" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Street"/>
<xs:enumeration value="State"/>
<xs:enumeration value="Zip"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
但这在我的案例中不起作用,因为我可能还会收到我不关心的其他地址元素(也有“Field”属性)
有没有办法确保我所关心的东西存在,但让其他东西也进来
蒂亚!
Sean您无法仅使用XML模式进行所需的验证 根据 当模型组的{particles}中直接或间接包含的两个或多个粒子具有相同名称的元素声明时 作为它们的{term},这些声明的类型定义必须是 一样 这并不是说您不能构建一个能够验证正确文档的模式。这意味着,您不能构建无法在某些错误文档上验证的模式。当我说“不正确”时,我指的是违反您用英语所述限制的文件 例如,假设您有一个包含三个Street元素的文档,如下所示:
<Address Field="Street" Value="123 Main"/>
<Address Field="Street" Value="456 Main"/>
<Address Field="Street" Value="789 Main"/>
<Address Field="SomeOtherCrazyValue" Value="Foo"/>
<root>
<Street Value="101 Bellavista Drive"/>
<State Value="Confusion"/>
<Zip Value="10101"/>
</root>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:element name="root">
<xs:complexType>
<xs:all>
<xs:element maxOccurs="1" minOccurs="1" ref="Street" />
<xs:element maxOccurs="1" minOccurs="1" ref="State" />
<xs:element maxOccurs="1" minOccurs="1" ref="Zip" />
</xs:all>
</xs:complexType>
</xs:element>
<xs:element name="Street">
<xs:complexType>
<xs:attribute name="Value" use="required" type="xs:string"/>
</xs:complexType>
</xs:element>
<xs:element name="State">
<xs:complexType>
<xs:attribute name="Value" use="required" type="xs:string"/>
</xs:complexType>
</xs:element>
<xs:element name="Zip">
<xs:complexType>
<xs:attribute name="Value" use="required" type="xs:string"/>
</xs:complexType>
</xs:element>
</xs:schema>
B.根据不同的模式验证该转换的输出,如下所示:
<Address Field="Street" Value="123 Main"/>
<Address Field="Street" Value="456 Main"/>
<Address Field="Street" Value="789 Main"/>
<Address Field="SomeOtherCrazyValue" Value="Foo"/>
<root>
<Street Value="101 Bellavista Drive"/>
<State Value="Confusion"/>
<Zip Value="10101"/>
</root>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:element name="root">
<xs:complexType>
<xs:all>
<xs:element maxOccurs="1" minOccurs="1" ref="Street" />
<xs:element maxOccurs="1" minOccurs="1" ref="State" />
<xs:element maxOccurs="1" minOccurs="1" ref="Zip" />
</xs:all>
</xs:complexType>
</xs:element>
<xs:element name="Street">
<xs:complexType>
<xs:attribute name="Value" use="required" type="xs:string"/>
</xs:complexType>
</xs:element>
<xs:element name="State">
<xs:complexType>
<xs:attribute name="Value" use="required" type="xs:string"/>
</xs:complexType>
</xs:element>
<xs:element name="Zip">
<xs:complexType>
<xs:attribute name="Value" use="required" type="xs:string"/>
</xs:complexType>
</xs:element>
</xs:schema>
您需要扩展该模式以处理转换输出中的其他元素,如
。或者您可以构造xsl转换,使其不发出不属于{State,Street,Zip}的元素
需要明确的是,我理解您不能更改收到的XML。这种方法不需要这样做。它只是使用了一种时髦的两步验证方法。一旦第二个验证步骤完成,您可以放弃转换的结果
编辑-实际上,肖恩,再考虑一下,您可以使用步骤B。假设您的XSL转换只从文档中删除字段属性值不包含State、Street或Zip的
元素。换句话说,就不会有
。可以使用maxOccurs=“3”、minOccurs=“3”和xs:unique使用您的模式验证该转换的结果 我和你有同样的问题,但我用一个技巧克服了
请求XML
<request>
<url>Abcd</url>
<base-url>XXXXX/</base-url>
<args src="url">
<arg name="languageCode">NL</arg>
<arg name="version">1</arg>
<arg name="offerId">10</arg>
<arg name="rewardId">1234</arg>
</args>
</request>
Abcd
XXXXX/
NL
1.
10
1234
现在使用xslt并将其转换
XSLT代码
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8"
indent="yes" />
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="arg">
<xsl:element name="{@name}">
<xsl:apply-templates />
</xsl:element>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>
<request>
<url>abcd</url>
<base-url>XXXXXXX</base-url>
<args src="url">
<languageCode>NL</languageCode>
<version>1</version>
<offerId>10</offerId>
<rewardId>1234</rewardId>
</args>
</request>
XML变为
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8"
indent="yes" />
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="arg">
<xsl:element name="{@name}">
<xsl:apply-templates />
</xsl:element>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>
<request>
<url>abcd</url>
<base-url>XXXXXXX</base-url>
<args src="url">
<languageCode>NL</languageCode>
<version>1</version>
<offerId>10</offerId>
<rewardId>1234</rewardId>
</args>
</request>
abcd
XXXXXXX
NL
1.
10
1234
现在应用XSD
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="request">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="url"/>
<xs:element type="xs:string" name="base-url"/>
<xs:element name="args" maxOccurs="unbounded" minOccurs="0">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element type="xs:string" name="languageCode" minOccurs="0"/>
<xs:element type="xs:string" name="version" minOccurs="0"/>
<xs:element type="xs:string" name="offerId" minOccurs="1"/>
<xs:element type="xs:string" name="rewardId" minOccurs="1"/>
</xs:sequence>
<xs:attribute type="xs:string" name="src" use="optional"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
我认为你的建议无论如何都行不通,即使你不可能有其他疯狂的价值属性。原因是,您建议的模式将报告为有效的XML文档,该文档有3个
元素,每个元素都有一个Street属性。(没有邮政编码,就没有州)。你的模式不能解决这个问题。嗯,这是真的。在我的领域,其他因素会阻止这种情况发生。但在一般情况下,它肯定可以。我将在原始问题中添加关于该部分的注释。当然,我的实际问题仍然悬而未决。谢谢你!反应很好,奇索。非常感谢。你写的是我怀疑的。我必须考虑您关于使用xsl转换(或RelaxNG/Gaelic;^)的建议。我最初的想法是,因为我碰巧将xml解组为JavaPOJO,所以我可以编写一个简单的例程,在该点检查它们。当然,如果可能的话,在一个xsd中完成这一切会更好。再次感谢!事实上,我认为放松是“盖尔人”的选择。做XSL转换是学习盖尔语的另一种选择——只是用一种你已经知道的语言做额外的工作。ps:我知道有人会踩我的脚,因为我把RelaxNG和盖尔语相比较。