образец XSD не работает с сообщением «ошибка: не найдено объявление для элемента X»
-
29-10-2019 - |
Вопрос
Несмотря на то, что я был новичком в области синтаксического анализа 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:
общийДругие советы
Есть несколько вариантов.Расположение схемы может быть предоставлено в файл
.
<?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>
Другой вариант - обеспечить местоположение схемы в файле
Если мы предполагаем, что файл схемы находится в FilePath
Мы должны вместо письма
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:
РЕДАКТИРОВАТЬ: игнорируйте этот ответ.Я оставляю это, потому что комментарии стоит сохранить. <удар> Ваш XSD говорит:
но ваш XML говорит:
общийВозможно, XSD должен быть:
общий
Кроме того, в XML отсутствует объявление xsi: schemaLocation .Было бы полезно иметь один.