Я использую Delphi 10.2 обновление 3. Я следовал этим инструкциям для проверки сгенерированного xml документа.
Какое влияние оказывает атрибут noNamespaceSchemaLocation на XML синтаксический анализ?
Проверка XML с использованием Windows DOM и TXMLDocument: не работает на некоторых компьютерах
проверка схемы с ms xml in delphi
Но у меня есть ошибка."Атрибут 'noNamespaceSchemaLocation' для элемента 'jegyzek_adatok' не определен в DTD / схеме."
Подготовка xml документа:
const cSchemaLocation = 'noNamespaceSchemaLocation'; procedure PreparePostBookXMLDocument(ARootNode: IXMLNode); var xDoc: IXMLDocument; begin if ARootNode.OwnerDocument = nil then Exit; xDoc := ARootNode.OwnerDocument; xDoc.Version := '1.0'; xDoc.Encoding := 'windows-1250'; xDoc.Options := xDoc.Options + [doNodeAutoIndent]; ARootNode.Attributes['xmlns:xsi'] := 'http://www.w3.org/2001/XMLSchema-instance'; ARootNode.Attributes['xsi:' + cSchemaLocation] := 'https://www.posta.hu/static/internet/download/level_ver8_ugyfeleknek_8p4.xsd'; end;
Проверка:
function ValidatePostBookXMLDocument(ARootNode: IXMLNode): IResult; var xDocument: IXMLDocument; xMsxmlDoc: IXMLDOMDocument3; xXSDDocument: IXMLDOMDocument3; xSchemaCache: IXMLDOMSchemaCollection; xSchemaLocation: string; xError: IXMLDOMParseError; begin Result := ERRUnknown; try if ARootNode = nil then Exit; xDocument := ARootNode.OwnerDocument; if xDocument = nil then Exit; xMsxmlDoc := ((xDocument.DOMDocument as IXMLDOMNodeRef).GetXMLDOMNode as IXMLDOMDocument3); xSchemaLocation := ARootNode.AttributeNodes.FindNode(cSchemaLocation).Text; xXSDDocument := CoDOMDocument60.Create; xXSDDocument.async := False; xXSDDocument.validateOnParse := True; if not xXSDDocument.load(xSchemaLocation) then Exit(MakeErrorResult(ohFileError, 'A validációhoz szükséges séma fájlt nem sikerült betölteni!')); xSchemaCache := CoXMLSchemaCache60.Create; xSchemaCache.add('', xXSDDocument); xMsxmlDoc.schemas := xSchemaCache; xError := xMsxmlDoc.validate; case xError.errorCode of S_OK: Result := Success; else Exit(MakeErrorResult(ohError, xError.reason)); end; except on E:Exception do Result := HandleException; end; end;
Сгенерированный файл xml, действует через https://www.freeformatter.com/xml-validator-xsd.html#.
XSD (https://www.posta.hu/static/internet/download/level_ver8_ugyfeleknek_8p4.xsd):
Мой сгенерированный xml (на моем диске Google):
Кто-нибудь может мне помочь?
Я не знаю специфицированный c XML парсер, который вы используете в Delphi. Однако, чтобы ответить на общие вопросы:
атрибут xsi:noNamespaceSchemaLocation объявляет, где найти схему XSD для документа (в частности, схему для элементов без пространства имен)
xsi:noNamespaceSchemaLocation
это не имеет никакого эффекта, если вы не вызовете проверку схемы XSD. Некоторые синтаксические анализаторы могут интерпретировать наличие этого атрибута как сигнал для вызова проверки схемы, но это довольно необычно.
при проверке по схеме XSD этот атрибут всегда действителен при условии, что его значение является действительным URI. Схема не должна явно разрешать этот атрибут.
при проверке на DTD, этот атрибут недействителен, если DTD не записан, чтобы явно разрешить его.
Я подозреваю, что вы запускаете анализатор с включенной проверкой DTD и что DTD не позволяет этому атрибуту присутствовать. Но это немного догадка.