xml — Xerces-C ++ Не найдено объявлений для элемента

Я использую xerces c ++ на HP Nonstop для проверки xml-файла на xsd-файл. Я создаю InputSources для файла xml и xsd, потому что у меня возникли некоторые ошибки при загрузке его путем filepath. Грамматика не равна нулю, и анализатор не вызывает errorHandler с сообщением, что xml не может быть найден. Поэтому я предполагаю, что оба файла загружены, потому что раньше я получал некоторые ошибки.

в parser.parse(*xmlFile) метод происходит ошибка no declaration found for element \'personnel\'

Вот как я использую SAXParser:

static bool validateSchema(const char* schemaFilePath, const char* xmlFilePath) {
SaxParser parser;
ParserErrorHandler parserErrorHandler;
int errorCount = 1;

// create inputsource for xml
const XMLCh* baseId = XMLString::transcode("<basepath>");
const XMLCh* xmlId = XMLString::transcode("<relative path>");
InputSource* xmlFile = new LocalFileInputSource(baseId, xmlId);

// create inputsource for xsd file
const XMLCh* xsdId = XMLString::transcode("<relative path>");
InputSource* xsdFile = new LocalFileInputSource(baseId, xsdId);

// load grammar
Grammar* grammar = domParser.loadGrammar(*xsdFile, Grammar::SchemaGrammarType, true);
if (grammar == NULL) {
return false;
}

domParser.setErrorHandler(&parserErrorHandler);
domParser.setValidationScheme(XercesDOMParser::Val_Always);
domParser.setDoNamespaces(false);
domParser.setDoSchema(true);
domParser.setValidationConstraintFatal(true);
domParser.setExitOnFirstFatalError(false);
domParser.parse(*xmlFile);

errorCount = domParser.getErrorCount();
return errorCount == 0;
}

Вот XML-файл (это пример Xerces C ++):

<?xml version="1.0" encoding="iso-8859-1"?>

<personnel>

<person id="Big.Boss" >
<name><family>Boss</family> <given>Big</given></name>
<email>[email protected]</email>
<link subordinates="one.worker two.worker three.worker four.worker five.worker"/>
</person>

<person id="one.worker">
<name><family>Worker</family> <given>One</given></name>
<email>[email protected]</email>
<link manager="Big.Boss"/>
</person>

<person id="two.worker">
<name><family>Worker</family> <given>Two</given></name>
<email>[email protected]</email>
<link manager="Big.Boss"/>
</person>

<person id="three.worker">
<name><family>Worker</family> <given>Three</given></name>
<email>[email protected]</email>
<link manager="Big.Boss"/>
</person>

<person id="four.worker">
<name><family>Worker</family> <given>Four</given></name>
<email>[email protected]</email>
<link manager="Big.Boss"/>
</person>

<person id="five.worker">
<name><family>Worker</family> <given>Five</given></name>
<email>[email protected]</email>
<link manager="Big.Boss"/>
</person>

</personnel>

и вот файл xsd:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'>

<xs:import namespace="http://www.w3.org/XML/1998/namespace">
<xs:annotation>
<xs:documentation>
The schemaLocation of the relevant file is
"http://www.w3.org/2001/xml.xsd"; however,
we don't want to assume people are always
connected to the 'net when playing with this file.
</xs:documentation>
</xs:annotation>
</xs:import>

<xs:element name="personnel">
<xs:complexType>
<xs:sequence>
<xs:element ref="person" minOccurs='1' maxOccurs='unbounded'/>
</xs:sequence>
</xs:complexType>

<xs:unique name="unique1">
<xs:selector xpath="person"/>
<xs:field xpath="name/given"/>
<xs:field xpath="name/family"/>
</xs:unique>
<xs:key name='empid'>
<xs:selector xpath="person"/>
<xs:field xpath="@id"/>
</xs:key>
<xs:keyref name="keyref1" refer='empid'>
<xs:selector xpath="person"/>
<xs:field xpath="link/@manager"/>
</xs:keyref>

</xs:element>

<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element ref="name"/>
<xs:element ref="email" minOccurs='0' maxOccurs='unbounded'/>
<xs:element ref="url"   minOccurs='0' maxOccurs='unbounded'/>
<xs:element ref="link"  minOccurs='0' maxOccurs='1'/>
</xs:sequence>
<xs:attribute name="id"  type="xs:ID" use='required'/>
<xs:attribute name="note" type="xs:string"/>
<xs:attribute name="contr" default="false">
<xs:simpleType>
<xs:restriction base = "xs:string">
<xs:enumeration value="true"/>
<xs:enumeration value="false"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="salary" type="xs:integer"/>
<xs:anyAttribute namespace="http://www.w3.org/XML/1998/namespace" processContents="skip"/>
</xs:complexType>
</xs:element>

<xs:element name="name">
<xs:complexType>
<xs:all>
<xs:element ref="family"/>
<xs:element ref="given"/>
</xs:all>
<xs:anyAttribute namespace="http://www.w3.org/XML/1998/namespace" processContents="skip"/>
</xs:complexType>
</xs:element>

<xs:element name="family">
<xs:complexType>
<xs:simpleContent>
<xs:extension base='xs:string'>
<xs:anyAttribute namespace="http://www.w3.org/XML/1998/namespace" processContents="skip"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>

<xs:element name="given" >
<xs:complexType>
<xs:simpleContent>
<xs:extension base='xs:string'>
<xs:anyAttribute namespace="http://www.w3.org/XML/1998/namespace" processContents="skip"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>

<xs:element name="email" type='xs:string'/>

<xs:element name="url">
<xs:complexType>
<xs:attribute name="href" type="xs:string" default="http://"/>
</xs:complexType>
</xs:element>

<xs:element name="link">
<xs:complexType>
<xs:attribute name="manager" type="xs:IDREF"/>
<xs:attribute name="subordinates" type="xs:IDREFS"/>
</xs:complexType>
</xs:element>

<xs:notation name='gif' public='-//APP/Photoshop/4.0' system='photoshop.exe'/>

</xs:schema>

Я также попробовал setExternalNoNamespaceSchemaLocation метод, но получил ту же ошибку. Я понятия не имею, почему происходит эта ошибка. У кого-нибудь есть идеи, как получить дополнительную информацию от xerces, почему это происходит или как я могу решить эту проблему?

Я вызываю программу на c ++ с xerces программой cobol, но это не проблема. Он скомпилирован с помощью компилятора c89 на HP Nonstop.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]