cvc-elt.1: не удается найти объявление элемента 'MyElement'

Я пытаюсь проверить действительно простой XML с помощью xsd, но по какой-то причине я получаю эту ошибку. Я буду очень признателен, если кто-то может объяснить мне, почему.

XML-файл

<?xml version="1.0" encoding="utf-8"?> 
<MyElement>A</MyElement>

XSD файл

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.example.org/Test"
        xmlns:tns="http://www.example.org/Test"
        elementFormDefault="qualified">

    <simpleType name="MyType">
        <restriction base="string"></restriction>
    </simpleType>

    <element name="MyElement" type="tns:MyType"></element>
</schema>

5 ответов

Решение

Ваша схема предназначена для целевого пространства имен http://www.example.org/Test поэтому он определяет элемент с именем MyElement в этом целевом пространстве имен http://www.example.org/Test, Однако в вашем экземпляре документа есть элемент с именем MyElement ни в каком пространстве имен. Вот почему проверяющий синтаксический анализатор сообщает вам, что не может найти объявление для этого элемента, вы не предоставили схему для элементов в пространстве имен.

Вам либо нужно изменить схему, чтобы вообще не использовать целевое пространство имен, либо вам нужно изменить экземпляр, чтобы использовать, например, <MyElement xmlns="http://www.example.org/Test">A</MyElement>,

После внесения изменений, предложенных выше Мартином, я все еще получал ту же ошибку. Мне пришлось внести дополнительные изменения в мой код синтаксического анализа. Я анализировал файл XML с помощью DocumentBuilder, как показано в документах оракула:https://docs.oracle.com/javase/7/docs/api/javax/xml/validation/package-summary.html .

      // parse an XML document into a DOM tree
DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = parser.parse(new File("example.xml"));

Проблема заключалась в том, что DocumentBuilder по умолчанию не поддерживает пространство имен. Следующее дополнительное изменение решило проблему:

      // parse an XML document into a DOM tree
DocumentBuilderFactory dmfactory = DocumentBuilderFactory.newInstance();
dmfactory.setNamespaceAware(true);

DocumentBuilder parser = dmfactory.newDocumentBuilder();
Document document = parser.parse(new File("example.xml"));

У меня была эта ошибка для моего элемента XXX, и это было потому, что мой XSD был неправильно отформатирован в соответствии с javax.xml.bind v2.2.11 . Я думаю, что он использует более старый формат XSD, но я не удосужился подтвердить.

Мой первоначальный неправильный XSD был похож на следующее:

<xs:element name="Document" type="Document"/>
...
<xs:complexType name="Document">
    <xs:sequence>
        <xs:element name="XXX" type="XXX_TYPE"/>
    </xs:sequence>
</xs:complexType>

Хороший формат XSD для моей миграции был следующим:

<xs:element name="Document">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="XXX"/>
        </xs:sequence>
    </xs:complexType>        
</xs:element>
...
<xs:element name="XXX" type="XXX_TYPE"/>

И так далее для всех подобных узлов XSD.

Я получил ту же ошибку, работая в Eclipse с Maven с дополнительной информацией

schema_reference.4: Failed to read schema document 'https://maven.apache.org/xsd/maven-4.0.0.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.

Это было после копирования в новый контроллер и его интерфейс из примера Thymeleaf. Честно говоря, независимо от того, насколько я осторожен, я все еще не могу понять, как можно это понять. По (удачливой) догадке я щелкнул правой кнопкой мыши проект, щелкнул Maven и "Обновить проект", что устранило проблему.

Чтобы расширить верхний ответ. Если вы используете аннотации Java Web Services (JAX-WS) для определения своих служб, как в этом примере:

      @WebService(..., targetNamespace = "http://bar.foo.com/")

Затем убедитесь, что ваш запрос SOAP имеет точно такое же пространство имен, как указано в вашей аннотации:

      <soapenv:Envelope 
   xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
   xmlns:foo="http://bar.foo.com/">
   <soapenv:Header/>
   <soapenv:Body>
      <foo:someRequest>
          ...
      </foo:someRequest>
   </soapenv:Body>
</soapenv:Envelope>

В targetNamespaceв вашей аннотации и xmlns:fooсвойство в XML-запросе должно совпадать! Буквально каждый символ (включая пробелы) должен совпадать. Также не забудьте поставить /в конце (это очень распространенная ошибка).

Другие вопросы по тегам