【问题标题】:Using element instead of attribute in XSD/XML key/keyref definition在 XSD/XML 键/keyref 定义中使用元素而不是属性
【发布时间】:2017-04-06 04:48:05
【问题描述】:

在我的 XSD/XML 文件中设置 key/keyref 约束时遇到了一些问题。示例如下:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="PriorityDefinitionFileSchema"
    targetNamespace="myNamespace"
    elementFormDefault="qualified"
    xmlns="myNamespace"
    xmlns:this="myNamespace"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
  <xs:element name="PriorityDefinitionFile" type="this:PriorityDefinitionFile">
    <xs:key name="PriorityDefinition_PK">
      <xs:selector xpath="this:AvailablePriorities/this:PriorityDefinition"/>
      <xs:field xpath="Value"/>
    </xs:key>
    <xs:keyref name="PriorityDefinition_FK" refer="this:PriorityDefinition_PK">
      <xs:selector xpath="this:EventPriorityMappings/EventPriorityMapping"/>
      <xs:field xpath="PriorityValue"/>
    </xs:keyref>
  </xs:element>

  <xs:complexType name="PriorityDefinitionFile">
    <xs:sequence>
      <xs:element name="AvailablePriorities" type="this:AvailablePriorities"/>
      <xs:element name="EventPriorityMappings" type="this:EventPriorityMappings"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="AvailablePriorities">
    <xs:sequence>
      <xs:element name="PriorityDefinition" type="this:PriorityDefinition" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="PriorityDefinition">
    <xs:sequence>
      <xs:element name="Value" type="xs:unsignedByte"/>
      <xs:element name="Name" type="xs:string"/>
    </xs:sequence>
    <xs:attribute name="Id" use="required"/>
  </xs:complexType>

  <xs:complexType name="EventPriorityMappings">
    <xs:sequence>
      <xs:element name="EventPriorityMapping" type="this:EventPriorityMapping" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="EventPriorityMapping">
    <xs:sequence>
      <xs:element name="EventNr" type="xs:int"/>
      <xs:element name="EventHash" type="xs:string"/>
      <xs:element name="PriorityValue" type="xs:unsignedByte"/>
    </xs:sequence>
    <xs:attribute name="Id" use="required"/>
  </xs:complexType>
</xs:schema>

我在 Visual Studio 中遇到错误,说我的“PriorityDefinition_PK”无法验证。缺少键,或键包含空值。

我添加了一些用于测试的属性,因为大多数示例都使用了属性。令人惊讶的是,如果我在我的字段定义中使用“Id”属性,例如:&lt;xs:field xpath:"@Id"&gt;everythink 工作正常。因为我使用 XML 和 DataContractSerializer,所以我根本不能使用属性。

http://www.w3schools.com/xml/el_key.asp 上的 XSD 文档明确指出可以使用元素和属性。

那么,问题出在哪里?我尝试了各种 xpath,如 ./Value、.//Value 等,但不接受。

我正在使用这个示例 XML:

<?xml version="1.0" encoding="utf-8"?>
<PriorityDefinitionFile xmlns="myNamespace">
  <AvailablePriorities>
    <PriorityDefinition Id="0">
      <Value>0</Value>
      <Name>Subsequent Event</Name>
    </PriorityDefinition>
    <PriorityDefinition Id="1">
      <Value>1</Value>
      <Name>Normal Event</Name>
    </PriorityDefinition>
    <PriorityDefinition Id="2">
      <Value>2</Value>
      <Name>RootCause Event</Name>
    </PriorityDefinition>
  </AvailablePriorities>
  <EventPriorityMappings>
    <EventPriorityMapping Id="0">
      <EventNr>31000</EventNr>
      <EventHash>sdosdsadp</EventHash>
      <PriorityValue>2</PriorityValue>
    </EventPriorityMapping>
    <EventPriorityMapping Id="9">
      <EventNr>432432</EventNr>
      <EventHash>sdfdsfd</EventHash>
      <PriorityValue>9</PriorityValue>     <-- Should error here
    </EventPriorityMapping>
  </EventPriorityMappings>
</PriorityDefinitionFile>

【问题讨论】:

    标签: xml visual-studio xsd xsd-validation


    【解决方案1】:

    您没有始终如一地使用命名空间别名“this”

    <xs:element name="PriorityDefinitionFile"
                type="this:PriorityDefinitionFile">
        <xs:key name="PriorityDefinition_PK">
            <xs:selector xpath="this:AvailablePriorities/this:PriorityDefinition"/>
            <xs:field xpath="this:Value"/>
        </xs:key>
        <xs:keyref name="PriorityDefinition_FK"
                   refer="this:PriorityDefinition_PK">
            <xs:selector xpath="this:EventPriorityMappings/this:EventPriorityMapping"/>
            <xs:field xpath="this:PriorityValue"/>
        </xs:keyref>
    </xs:element>
    

    您的示例数据也没有正确的 FK(我已用 ** 和 ## 标记了 PK/FK)。

    <?xml version="1.0" encoding="utf-8"?>
    <!-- Created with Liquid XML 2017 Developer Bundle Edition 15.0.0.0 (https://www.liquid-technologies.com) -->
    <PriorityDefinitionFile xmlns="myNamespace"
                            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                            xsi:schemaLocation="myNamespace file:///D:/Development2017/Liquid/Applications/XmlStudio/Tests/UserSamples/40743074_using-element-instead-of-attribute-in-xsd-xml-key-keyref-definition/MySchema.xsd">
        <AvailablePriorities>
            <PriorityDefinition Id="0">
                ##<Value>0</Value>##
                <Name>Subsequent Event</Name>
            </PriorityDefinition>
            <PriorityDefinition Id="1">
                ##<Value>1</Value>##
                <Name>Normal Event</Name>
            </PriorityDefinition>
            <PriorityDefinition Id="2">
                ##<Value>2</Value>##
                <Name>RootCause Event</Name>
            </PriorityDefinition>
        </AvailablePriorities>
        <EventPriorityMappings>
            <EventPriorityMapping Id="0">
                <EventNr>31000</EventNr>
                <EventHash>sdosdsadp</EventHash>
                **<PriorityValue>2</PriorityValue>**
            </EventPriorityMapping>
            <EventPriorityMapping Id="9">
                <EventNr>432432</EventNr>
                <EventHash>sdfdsfd</EventHash>
                **<PriorityValue>1</PriorityValue>**
            </EventPriorityMapping>
            <EventPriorityMapping Id="10">
                <EventNr>432432</EventNr>
                <EventHash>sdfdsfd</EventHash>
                **<PriorityValue>0</PriorityValue>**
            </EventPriorityMapping>
        </EventPriorityMappings>
    </PriorityDefinitionFile>
    

    【讨论】:

    • 非常感谢!我明白了,我忘记了 .../this:EventPriorityMapping 处的 this 标识符...我很确定我之前尝试过...问题似乎是 Value 和 PriorityValue 处缺少标识符,但为什么会这样?我认为这个标识符是一些“类型标识符”,但 Value 和 PriorityValue 是 complexType 中的元素。有点混乱...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    • 2023-03-29
    • 2012-08-11
    • 1970-01-01
    相关资源
    最近更新 更多