Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XML模式:我可以创建一些属性';是否需要s值,但仍允许其他值?_Xml_Schema_Xsd - Fatal编程技术网

XML模式:我可以创建一些属性';是否需要s值,但仍允许其他值?

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

(注意:我无法更改收到的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 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和盖尔语相比较。