2016-11-22 10 views
0

私のXSD/XMLファイルでkey/keyref制約を設定する際に問題があります。ここでは例です: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> 

私は私の「PriorityDefinition_PKは」検証できないというのVisual Studioでのエラーを取得しています。キーがないか、キーに空の値が含まれています。

私はテストのためにいくつかの属性を追加しました。ほとんどの例では属性が使用されています。そして驚いたことに、フィールド定義で「Id」属性を使用している場合:<xs:field xpath:"@Id"> everythinkはうまく動作します。 DataContractSerializerでXMLを使用しているため、属性を使用することはできません。

XSDドキュメントhttp://www.w3schools.com/xml/el_key.aspには、要素と属性を使用できることが明らかです。

ここで問題はどこにありますか?私は./Value、.//Valueなどのようなさまざまなxpathを試しましたが、それを受け入れません。また、あなたのサンプルデータがありません 'この' 一貫名前空間のエイリアス

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> 

を使用していませんでした

<?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

私は、この例のXMLを使用しています正しい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の識別子が不足しているようですが、それはなぜですか?私はこの識別子を何らかの "Type-Identifier"と考えましたが、ValueとPriorityValueはcomplexType内部の要素です。ちょっと混乱... – TheAngryCube

関連する問題