Не удается проверить XML с несколькими XSD schemaLocation - PullRequest
0 голосов
/ 21 октября 2019

Я пытаюсь проверить XML с несколькими XSD внутри, и проверка в порядке, но это не так.

Например, мой XML

<cnt:FirstXsd xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                    xmlns:cat="CommonTypes"
                    xmlns:cnt="FirstXsd"
                    xmlns:env="http://www.w3.org/2001/06/soap-envelope"
                    xsi:schemaLocation="FirstXsd FirstXsd.xsd">
   <cat:DocumentID>TEST_TEXT</cat:DocumentID>
   <cnt:FirstDoc>
      <cnt:DocBody>
         <sec:SecondXsd xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                            xmlns:cat="CommonTypes"
                            xmlns:sec="SecondXsd"
                            xsi:schemaLocation="SecondXsd Second.xsd">
            <cat:DocumentID>TEST_NUMBER</cat:DocumentID>    
         </sec:SecondXsd>
      </cnt:DocBody>
    </cnt:FirstDoc>
</cnt:FirstXsd>

И <cat:DocumentID>TEST_NUMBER</cat:DocumentID> требуется

Я проверяю с этим кодом

public class Main {

  public static void main(String[] args) {

    File xsds=new File[]{new File(this.getClass().getClassLoader().getResource("First.xsd").getFile()),new File(this.getClass().getClassLoader().getResource("Second.xsd").getFile())};
    File xml = new File(this.getClass().getClassLoader().getResource("test.xml").getFile());

    System.out.println(validation.validateXMLByXSD_Array(new StreamSource(new StringReader(xml)),xsds));
}


public boolean validateXMLByXSD_Array(Source xml, File[] xsds) {

    Source[] sources = new Source[xsds.length];
    for (int i = 0; i < xsds.length; i++) {
        sources[i] = new StreamSource(xsds[i]);
    }
    SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    try {
        Schema schema = schemaFactory.newSchema(sources);
        Validator validator = schema.newValidator();
        validator.setErrorHandler(new ForgivingErrorHandler());
        validator.validate(xml);
    }  catch (SAXException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return true;
}

Итак, моя проблема в том, что каждый раз я не получаю никаких ошибок, если я удаляю требуемый <cat:DocumentID> или нет. Но, если я удаляю полный <cnt:DocBody>, который требуется из First.xsd, я получаю ошибку.

Кажется, что проверяется только первый XSD, который происходит в JVM в XML. Когда я пытаюсь отладить, я вижу, что в моей схеме есть оба xsd, как написано здесь

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:cat="CommonTypes:1.0" xmlns:cnt="FirstXsd:1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="FirstXsd:1.0" elementFormDefault="qualified" version="1.0">
    <xs:import namespace="CommonTypes:1.0" schemaLocation="CommonTypes.xsd"/>
    <xs:element name="FirstXsd" type="cnt:FirstXsdType"/>
    <xs:complexType name="FirstXsdType">
        <xs:complexContent>
            <xs:extension base="cat:BaseDocType">
                <xs:attribute name="DocumentModeID" type="cat:DocumentModeIDType" use="required" fixed="TEST_TEXT"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="ContainerDocType">
        <xs:sequence>
            <xs:element name="Element1" type="cat:Element1" minOccurs="0"/>
            <xs:element name="Element2" type="cat:Element2" minOccurs="0"/>
            <xs:element name="Element3" type="cat:Element3" minOccurs="0"/>
            <xs:element name="DocBody" type="cat:DocBodyType"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="DocBodyType">
        <xs:sequence>
            <xs:any processContents="skip"/>
        </xs:sequence>
    </xs:complexType>
</xs:schema>


<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:cat="CommonTypes:1.0" xmlns:sec="SecondXsd:1.0" targetNamespace="SecondXsd:1.0" elementFormDefault="qualified" version="1.0">
    <xs:import namespace="CommonTypes:1.0" schemaLocation="CommonTypes.xsd"/>
    <xs:element name="SecondXsd" type="sec:SecondXsdType"/>
    <xs:complexType name="SecondXsdType">
        <xs:complexContent>
            <xs:extension base="cat:BaseDocType">
                <xs:sequence>
                    <xs:element name="Element1" type="cat:Element1"/>
                    <xs:element name="Element2" type="cat:Element2"/>
                    <xs:element name="Element3" type="cat:Element3" minOccurs="0" maxOccurs="unbounded"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
</xs:schema>

1 Ответ

0 голосов
/ 24 октября 2019

Спасибо за предоставление xsds. Было бы полезно увидеть определение CommonTypes.xsd. Тем не менее, я думаю, что могу сделать полезный комментарий на основе того, что вы опубликовали.

Вы утверждаете, что cat: DocumentID требуется, но он нигде не отображается в содержимом cnt: FirstXsd. Определяет ли CommonTypes.xsd глобальный элемент с именем «DocumentID»? Даже если это так, ваш XSD не ссылается на него, поэтому он не требуется в качестве члена cnt: FirstXsd.

Я не думаю, что это является дефектом в реализации Java проверки XSD. Пожалуйста, объясните, чего вы пытаетесь достичь, чтобы мы могли предложить лучшее решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...