Да, я посмотрел на этот вопрос: Неверное определение корневого элемента в схеме XML
Вот пример моего кода, который загружает XML и проверяет его по схеме XMLгенерируется на лету.
Проблема заключается в том, что при добавлении схемы XML, сгенерированной как объект документа DOM, я получаю сообщение об ошибке:
EOleException: / schema
Неверное определение корневого элемента в схеме XML
, но когда я перезагружаю документ XSD dom в себя в виде строки:
xsd.loadXML(xsd.xml);
ошибка исчезает.
Я сделал также 2 отладочных выхода XSD: до перезагрузки и после.Оба файла идентичны побайтно!
Я понятия не имею, что может быть не так, и предполагаю, что если строковые представления документов XML идентичны, то структуры объектов также идентичны.
program XsdValidatorMCV;
uses
Winapi.MSXMLIntf, System.Win.ComObj, Winapi.ActiveX;
var
xsd: IXMLDOMDocument2;
xsdl: IXMLDOMSchemaCollection;
root: IXMLDOMElement;
el: IXMLDOMElement;
begin
CoInitialize(nil);
xsd := CreateOleObject('Msxml2.DOMDocument.6.0') as IXMLDOMDocument2;
xsdl := CreateOleObject('Msxml2.XMLSchemaCache.6.0') as IXMLDOMSchemaCollection;
try
xsd.appendChild(xsd.createProcessingInstruction('xml', 'version="1.0"'));
root := xsd.createElement('xs:schema');
root.setAttribute('xmlns:xs', 'http://www.w3.org/2001/XMLSchema');
xsd.appendChild(root);
el := xsd.createElement('xs:element');
root.appendChild(el);
el.setAttribute('name', 'data');
xsd.save('generated1.xsd'); //Debug output
//Workaround: reloading itself as string eliminates strange schema error:
//EOleException: /schema Incorrect definition for the root element in XML schema.
xsd.loadXML(xsd.xml);
xsd.save('generated2.xsd'); //Debug output
xsdl.add('', xsd); //Here is an error when without xsd.loadXML(xsd.xml)
finally
xsdl := nil;
xsd := nil;
end;
end.