Witam,
mam następujący komunikat przy walidacji pliku XML za pomocą XSD:
„Węzeł nie jest poprawny ani niepoprawny. Nie znaleziono deklaracji schematu lub definicji DTD”.
Robię walidację w C++ przy użyciu biblioteki MSXML 6.0. Nie używam .NET.
Kod wygląda następująco. Najpierw tworzę obiekt IXMLDOMSchemaCollection2:
hr = CoCreateInstance(
__uuidof(XMLSchemaCache60),
NULL,
CLSCTX_ALL,
__uuidof(IXMLDOMSchemaCollection2),
(void**)&this->SchemaCache);
if(FAILED(hr))
{
cerr << "Błąd przy tworzeniu SchemaCache";
return;
}
Następnie kojarzę go z czytnikiem XML:
hr = XMLReader->putProperty(L"schemas", _variant_t((IUnknown*)this->SchemaCache));
if(FAILED(hr))
{
cerr << "Błąd przy ustawianiu SchemaCache dla czytnika";
}
Na koniec włączam walidację przy użyciu XSD i dodaję schemat:
//Włącz walidację za pomocą XSD.
HRESULT hr = this->XMLReader->putFeature(L"schema-validation", VARIANT_TRUE);
if(FAILED(hr))
{
cerr << "Błąd przy ustawianiu własności";
return false;
}
//Dodaj nowy schemat.
_bstr_t bstrNamespace = namespaceURI.c_str();
hr = this->SchemaCache->add(bstrNamespace, _variant_t(xsdPath.c_str()));
if(FAILED(hr))
{
cerr << "Błąd przy dodawaniu schematu";
return false;
}
Te dwie ostatnie czynności wykonuję w metodzie AddValidationSchema, która jako pierwszy argument przyjmuje przestrzeń nazw, a jako drugi ścieżkę do pliku XSD.
Kod w main wygląda tak:
CommonXMLReader *Reader = new CommonXMLReader;
Reader->SetFile(L"books.xml");
Reader->AddValidationSchema(L"http://www.w3.org/2001/XMLSchema", L"books.xsd");
Reader->Start(); //Tu wykonuje się walidacja.
Plik XML:
<?xml version="1.0" encoding="UTF-8"?> <catalog> <book> <author>Gambardella, Matthew</author> </book> </catalog>Plik XSD:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="catalog">
xsd:complexType
xsd:sequence
<xsd:element name="book" minOccurs="0" maxOccurs="unbounded">
xsd:complexType
xsd:sequence
<xsd:element name="author" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
Pliki XML i XSD są na pewno poprawne. Wypróbowałem je na walidatorze online.
Program nie zgłasza żadnych błędów przy inicjalizowaniu obiektów.
Co może być źle? Byłbym wdzięczny za naprowadzenie na rozwiązanie tego problemu.