2015-06-17 3 views
1

У меня есть Java код, проверить мой XML против XSD:Xml проверки против XSD принимает неправильный XML действительным

public static void main(String[] args) throws Exception { 
    Source xmlFile = new StreamSource(new File("src/main/resources/file.xml")); 

    SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
    Schema schema = schemaFactory.newSchema(new Source[] { 
      new StreamSource(new File("src/main/resources/RegTypy.xsd")), 
      new StreamSource(new File("src/main/resources/XopInclude.xsd")), 
      new StreamSource(new File("src/main/resources/RobTypy.xsd")), 
      new StreamSource(new File("src/main/resources/RobDotazyData.xsd")), }); 
    Validator validator = schema.newValidator(); 
    try { 
     validator.validate(xmlFile); 
     System.out.println(xmlFile.getSystemId() + " is valid"); 
    } catch (SAXException e) { 
     System.out.println(xmlFile.getSystemId() + " is NOT valid"); 
     System.out.println("Reason: " + e.getLocalizedMessage()); 
    } 
} 

XSD для загрузки являются here: в корневой директории и в обокрасть/каталог XSD

сейчас мой XML выглядит следующим образом:

<data:RobCtiAifoData xmlns:ns2="urn:cz:isvs:rob:schemas:RobTypy:v1" xmlns:data="urn:cz:isvs:rob:schemas:RobDotazyData:v1" xmlns:reg="urn:cz:isvs:reg:schemas:RegTypy:v1"> 
    <data:Aifo stav="spravny" xsi:type="ns2:LokalniAifoStavType" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">2</data:Aifo> 
    <data:VyuzitiPoskytnuti>vyuziti</data:VyuzitiPoskytnuti> 
</data:RobCtiAifoData> 

важная часть из XSD является:

<xs:complexType name="RobCtiAifoDataType"> 
    <xs:annotation> 
     <xs:documentation xml:lang="cs">Čtení referenčních údajů podle AIFO.</xs:documentation> 
    </xs:annotation> 
    <xs:sequence> 
     <xs:element name="Aifo" type="reg:LokalniAifoType" /> 
     <!-- omezení - jenom využití nebo poskytnutí --> 
     <xs:element name="VyuzitiPoskytnuti" type="rob:TypVyuzitiPoskytnutiType" /> 
    </xs:sequence> 
    <xs:attribute name="znepristupniLog" type="xs:boolean" /> 
</xs:complexType> 

как вы можете видеть Aifo должен иметь тип reg:LokalniAifoType, но в xml он переопределяется ns2: LokalniAifoStavType, который имеет дополнительный параметр stav. Вопрос в том, почему этот тип принят в xml и почему он действителен xml.

UPDATE:

<xs:complexType name="LokalniAifoType"> 
    <xs:annotation> 
     <xs:documentation xml:lang="cs">Lokální identifikátor AIFO. Klíč typu integer.</xs:documentation> 
    </xs:annotation> 
    <xs:simpleContent> 
     <xs:extension base="xs:int"> 
      <xs:attribute name="prevodAifoStatus" type="PrevodAifoStatusType"> 
       <xs:annotation> 
        <xs:documentation xml:lang="cs">Informace o výsledku převodu v ORG, pokud se nepodařilo přeložit.</xs:documentation> 
       </xs:annotation> 
      </xs:attribute> 
      <xs:attribute name="stavOvereniAifo" type="xs:boolean"> 
       <xs:annotation> 
        <xs:documentation xml:lang="cs">Existence AIFO se má ověřit v ROB.</xs:documentation> 
       </xs:annotation> 
      </xs:attribute> 
     </xs:extension> 
    </xs:simpleContent> 
</xs:complexType> 


<xs:complexType name="LokalniAifoStavType"> 
    <xs:annotation> 
     <xs:documentation xml:lang="cs">Agendový identifikátor fyzické osoby včetně stavu a času 
      poslední změny. 
     </xs:documentation> 
    </xs:annotation> 
    <xs:simpleContent> 
     <xs:extension base="reg:LokalniAifoType"> 
      <xs:attribute name="stav" type="reg:StavType" /> 
      <xs:attribute name="zmenaCas" type="ZmenaCasType" /> 
     </xs:extension> 
    </xs:simpleContent> 
</xs:complexType> 
+0

Просьба показать нам также определение типов 'reg: LokalniAifoType' и' ns2: LokalniAifoStavType'. – potame

+0

вы можете найти его в xsd, но нормально я тоже добавляю его к этому вопросу – hudi

ответ

0

Вы явно простирающийся с помощью xs:extension в LokalniAifoStavType? если элемент указывает его тип LokalniAifoType, то любой из его расширенного типа может появиться в XML.

+0

, но почему? в xsd определяется родительский. Я не хочу принимать расширенного ребенка здесь – hudi

+0

Это похоже на наследование Java - «подстановка» - дочерний элемент может использоваться в любом контексте, где используется родитель. –

+0

Это не дает ответа на вопрос. Чтобы критиковать или просить разъяснения у автора, оставьте комментарий ниже их сообщения. – MuertoExcobito

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