2014-01-17 3 views
2

У меня есть XML-элемент. мне нужно проверить ли Параметр Атрибут держит только Y или N в следующем XML элементПодтвердить значение атрибута XML-элемента с помощью XSD

<Test Script="abc.sh" Parameter="Y"/> 
       **OR** 
<Test Script="abc.sh" Parameter="N"/> 

Мой XSD является:

<xs:element name="Test" minOccurs="0"> 
     <xs:complexType> 
      <xs:attribute name="Script" type="xs:string" use="required"/> 
      <xs:attribute name="Parameter" type="xs:string" use="optional"/>      
     </xs:complexType> 
    </xs:element> 

В настоящее время это XSD не проверка, является ли проведение параметра Y или N

ответ

4

Вы должны определить attribute с simpleType, представляющим restriction для обеспечения выполнения значения атрибута будучи членом определенного набора значений.

Представьте у вас есть следующий XML:

<?xml version="1.0"?> 
<Test Script="path/to/script" Parameter="Y" xmlns="http://www.example.org" /> 

Вы можете исполнять, что они type атрибут имеет значение foo или bar с помощью этого XSD:

<?xml version="1.0"?> 
<xsd:schema 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:tns="http://www.example.org" 
    targetNamespace="http://www.example.org" 
    elementFormDefault="qualified" 
    attributeFormDefault="unqualified" 
> 
    <xsd:element name="Test"> 
     <xsd:complexType> 
     <xsd:attribute name="Script" type="xsd:string" use="required"/> 
     <!-- the following has no type attribute. It's type is 
      defined in the simpleType child --> 
     <xsd:attribute name="Parameter" use="optional"> 
      <xsd:simpleType> 
      <!-- define a set of xsd:strings 
       as possible values --> 
      <xsd:restriction base="xsd:string"> 
       <xsd:enumeration value="Y"/> 
       <xsd:enumeration value="N"/> 
      </xsd:restriction> 
      </xsd:simpleType> 
     </xsd:attribute> 
     </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 
+0

Я использовал ; вы указали как В чем разница? – logan

+0

@logan Просто личные предпочтения. Вы можете заменить мой 'xsd' вашим' xs', если хотите. Какой префикс вы используете, это определено в 'xmlns: xsd = ..' или 'xmlns: xs' в главе схемы – hek2mgl

+0

Теперь я использую только xs, но он говорит org.xml.sax.SAXParseException: префикс" xsd "для элемента" xsd: simpleType "не привязан. – logan

2

Вы должны определить атрибут вашего параметра как этого

 <xs:simpleType name="yesno"> 
      <xs:restriction base="xs:string"> 
       <xs:enumeration value="Y" /> 
       <xs:enumeration value="N" /> 
      </xs:restriction> 
     </xs:simpleType> 



     <xs:attribute name="Parameter" type="xs:yesno" use="optional"/> 
+0

Сообщение об ошибке для недопустимого параметра говорит «Причина: cvc-e numeration-valid: Значение «YY» не является фасетным в отношении перечисления «[Y, N]». «Невозможно ли отобразить имя атрибута XML в сообщении об ошибке? – logan

+0

Я не уверен, как вы анализируете свой XML-документ. Возможно, вы захотите проверить документацию API (если разбор программно) или руководство пользователя (при использовании любого tool) – IndoKnight

1

попробовать это:

<xs:element name="Test" maxOccurs="unbounded"> 
       <xs:complexType> 
          <xs:attribute name="Script"> 
           <xs:simpleType> 
            <xs:restriction base="xs:string"> 
             <xs:enumeration value="abc.sh"> 
             </xs:enumeration> 
            </xs:restriction> 
           </xs:simpleType> 
          </xs:attribute> 
           <xs:attribute name="Parameter"> 
           <xs:simpleType> 
            <xs:restriction base="xs:string"> 
             <xs:pattern value="Y|N" > 
             </xs:pattern> 
            </xs:restriction> 
           </xs:simpleType>  
           </xs:attribute> 
       </xs:complexType> 
</xs:element> 
Смежные вопросы