2016-11-22 61 views
0

我在设置XSD/XML文件中的键/键引用约束时遇到了一些问题。以下是示例:在XSD/XML键/ 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”属性,如:<xs:field xpath:"@Id"> everythink正常工作。因为我在DataContractSerializer中使用XML,所以我根本无法使用属性。

有关http://www.w3schools.com/xml/el_key.asp的XSD文档清楚地表明可以使用元素和属性。

那么,这里的问题在哪里?我尝试了像./Value,.//Value等各种xpaths,但不会接受它。

我用这个例子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> 

回答

0

你不使用命名空间别名 '这个' 一贯

Diagram from Liquid XML

<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> 
+0

非常感谢您! 我看到了,我忘了这个标识符在.../this:EventPriorityMapping ... 我很确定我之前试过... 这个问题似乎是Value和PriorityValue中缺少的标识符,但为什么呢?我认为这个标识符为一些“型标识”的,但价值和PriorityValue是一个复杂类型的元素。有点混乱... – TheAngryCube

相关问题