образец XSD не работает с сообщением «ошибка: не найдено объявление для элемента X»

StackOverflow https://stackoverflow.com/questions/6393689

Вопрос

Несмотря на то, что я был новичком в области синтаксического анализа XML, я смог сгенерировать кодовый код для создания действительного кода xsd, а также успешно скомпилировать и связать его, но компилятор оптимизировал (?) создание экземпляра. Итак, начиная с первого шага, я пробую привет world xml на CodeSynthesis . Но это не удается:

общий

hello.c ++:

общий

hello.xml:

общий

hello.xsd:

общий

Я думаю, что это именно то, что он говорит, но команды работают не так, как описано в документации. Я обнаружил, что c++, похоже, работает правильно (в отличие от xsdcxx, который генерирует вывод C # или vb.net).

общий

Кроме того, я не добавляю код xsd (dir), и он успешно компилируется. Могло ли оно каким-то образом использовать неправильный включаемый файл?

Что я делаю не так? Может быть, сгенерировать кодовый код - неподходящий инструмент?

Это было полезно?

Решение

Лично я считаю комбинацию Python и lxml бесценной.Ваш XML-документ и соответствующая XML-схема работают нормально:

общий

Я не получил никаких ошибок.Однако я скажу, что, хотя lxml не требует от вас использования xsi: noNamespaceSchemaLocation, поскольку он загружает указанную вами схему, вы все равно должны использовать ее, пока не используете пространства имен.Просто потому, что один синтаксический анализатор XML является гибким, другие могут не быть, и этот факт, кажется, вы, возможно, выяснили на собственном горьком опыте.Если вы все же используете пространства имен, используйте xsi: schemaLocation вместо xsi: noNamespaceSchemaLocation.Также обратите внимание, что вы ДОЛЖНЫ объявить пространство имен xsi через атрибут xmlns: xsi, чтобы иметь возможность использовать атрибуты xsi: *.

Пример использования xsi: noNamespaceSchemaLocation:

общий

Другие советы

Есть несколько вариантов.Расположение схемы может быть предоставлено в файл HELLO.XML :

<?xml version="1.0"?>
<hello xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:noNamespaceSchemaLocation="hello.xsd">

  <greeting>Hello</greeting>

  <name>sun</name>
  <name>moon</name>
  <name>world</name>

</hello>
.

Другой вариант - обеспечить местоположение схемы в файле HELLO.c ++

Если мы предполагаем, что файл схемы находится в FilePath / Some/File/Path/hello.xsd

Мы должны вместо письма

auto_ptr<hello_t> h (hello ("hello.xml"));
.

Написать

xml_schema::properties properties;
properties.no_namespace_schema_location("file:///some/file/path/hello.xsd");
auto_ptr<hello_t> h (hello ("hello.xml", 0, properties));
.

Вы можете прочитать больше об этом в CodeSyntheis FAQ:

Почему я получаю«Ошибка: Никакая декларация не найдена для элемента« root-Element », когда я пытаюсь анализировать действительный XML-документ?

РЕДАКТИРОВАТЬ: игнорируйте этот ответ.Я оставляю это, потому что комментарии стоит сохранить. <удар> Ваш XSD говорит:

общий

но ваш XML говорит:

общий

Возможно, XSD должен быть:

общий

Кроме того, в XML отсутствует объявление xsi: schemaLocation .Было бы полезно иметь один.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top