У меня возникла проблема с установкой ограничения 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>
спасибо! Я вижу, я забыл этот идентификатор в .../this: EventPriorityMapping ... Я совершенно уверен, что я пробовал это раньше ... Проблема заключается в отсутствии идентификаторов в Value и PriorityValue, но почему? Я думал об этом идентификаторе как о некотором «Type-Identifier», но Value и PriorityValue являются элементами внутри complexType. Немного запутался ... – TheAngryCube