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-запросе должно совпадать! Буквально каждый символ (включая пробелы) должен совпадать. Также не забудьте поставить
/
в конце (это очень распространенная ошибка).