Delphi XML проверка с помощью XSD - PullRequest
1 голос
/ 15 февраля 2020

Я использую 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):

Кто-нибудь может мне помочь?

1 Ответ

1 голос
/ 16 февраля 2020

Я не знаю специфицированный c XML парсер, который вы используете в Delphi. Однако, чтобы ответить на общие вопросы:

  • атрибут xsi:noNamespaceSchemaLocation объявляет, где найти схему XSD для документа (в частности, схему для элементов без пространства имен)

  • это не имеет никакого эффекта, если вы не вызовете проверку схемы XSD. Некоторые синтаксические анализаторы могут интерпретировать наличие этого атрибута как сигнал для вызова проверки схемы, но это довольно необычно.

  • при проверке по схеме XSD этот атрибут всегда действителен при условии, что его значение является действительным URI. Схема не должна явно разрешать этот атрибут.

  • при проверке на DTD, этот атрибут недействителен, если DTD не записан, чтобы явно разрешить его.

Я подозреваю, что вы запускаете анализатор с включенной проверкой DTD и что DTD не позволяет этому атрибуту присутствовать. Но это немного догадка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...