2016-11-22 6 views
0

У меня возникла проблема с установкой ограничения key/keyref в моем файле 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 отлично работает. Поскольку я использую XML с DataContractSerializer, я не могу использовать атрибуты вообще.

Документация XSD по адресу http://www.w3schools.com/xml/el_key.asp четко говорит о том, что элементы и атрибуты могут использоваться.

Итак, где проблема? Я пробовал различные xpaths как ./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> 

ответ

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, но почему? Я думал об этом идентификаторе как о некотором «Type-Identifier», но Value и PriorityValue являются элементами внутри complexType. Немного запутался ... – TheAngryCube

Смежные вопросы