powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Валидация при сохранении
11 сообщений из 11, страница 1 из 1
Валидация при сохранении
    #35352247
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Глупый вопрос - как при создании XML перед записью проверить его на валидность?
Делаю так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
    LXML := CreateComObject(CLASS_DOMDocument40)  as  IXMLDOMDocument2;
    LXML.schemas := GetSchemaCache;
    LNode := LXML.createProcessingInstruction('xml', 'version="1.0" encoding="windows-1251"');
    LXML.appendChild(LNode);
    LNode := LXML.createProcessingInstruction('xml-stylesheet', 'type="text/xsl" href="savedata.xsl"');
    LXML.appendChild(LNode);
     // 
    LParentElem := LXML.createNode(NODE_ELEMENT, 'SaveData', FNameSpace)  as  IXMLDOMElement;
    LParentElem.setAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');
    LXML.appendChild(LParentElem);
    .....................
    LError := LXML.validate;
     if  LError.errorCode <>  0   then 
       raise  Exception.CreateFmt('Ошибка %.8x'# 13 # 10 '%s'# 13 # 10 '%s'# 13 # 10 'FilePos: %d',
        [LError.errorCode, LError.reason, LError.srcText, LError.filepos]);
    LXML.save('123.xml');
Говорит ошибка XML_E_NODTD (0xC00CE224)

Что я делаю не так? Сам XML получается валидный и тот же код, но при загрузке отлично работает

С уважением, Vasilisk
...
Рейтинг: 0 / 0
Валидация при сохранении
    #35353829
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Message ID Error Code (Hex Value) Message XML_E_NODTD 0xC00CE224 Validate failed because a DTD or schema was not specified in the document.
...
Рейтинг: 0 / 0
Валидация при сохранении
    #35354207
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это я знаю, но есть код
Код: plaintext
LXML.schemas := GetSchemaCache;
который присваивает свойству schemas экземпляр IXMLDOMSchemaCollection и он рабочий. Еще раз говорю, при загрузке документа все отлично валидируется.

Вот код метода GetSchemaCache, если интересно
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
 function  TForm1.GetSchemaCache: IXMLDOMSchemaCollection;
 var 
  LStream: IStream;
  LSchema: IXMLDOMDocument2;
  LNSAttr: IXMLDOMNode;
 begin 
   if  FSchemaCache =  nil   then   begin 
    FSchemaCache := CreateComObject(CLASS_XMLSchemaCache40)  as  IXMLDOMSchemaCollection;
     try 
      LSchema := CreateComObject(CLASS_DOMDocument40)  as  IXMLDOMDocument2;
      LSchema.async := False;
      LSchema.validateOnParse := True;
      LStream := TStreamAdapter.Create(TResourceStream.Create(HInstance, 'SaveData', 'XSD'), soOwned);
       if   not  LSchema.load(LStream)  then 
         raise  Exception.Create('Не вдалося завантажити XSD схему');
      LSchema.setProperty('SelectionLanguage', 'XPath');
      LSchema.setProperty('SelectionNamespaces', 'xmlns:ns="http://www.w3.org/2001/XMLSchema"');
      LNSAttr := LSchema.selectSingleNode('/ns:schema/@targetNamespace');
      FNameSpace := LNSAttr.nodeValue;
      FSchemaCache.add(FNameSpace, LSchema);
     except 
      FSchemaCache :=  nil ;
       raise ;
     end ;
   end ;
  Result := FSchemaCache;
 end ;

С уважением, Vasilisk
...
Рейтинг: 0 / 0
Валидация при сохранении
    #35359695
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вспомнил этот финт ушами, который нужно произвести
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
    LXML := CreateComObject(CLASS_DOMDocument40)  as  IXMLDOMDocument2;
    LXML.schemas := GetSchemaCache;
    LXML.async := False;
    LXML.validateOnParse := False;
     // 
    LTmpXML := CreateComObject(CLASS_DOMDocument40)  as  IXMLDOMDocument2;
    LNode := LTmpXML.createProcessingInstruction('xml', 'version="1.0" encoding="windows-1251"');
    LTmpXML.appendChild(LNode);
    LNode := LTmpXML.createProcessingInstruction('xml-stylesheet', 'type="text/xsl" href="savedata.xsl"');
    LTmpXML.appendChild(LNode);
     // 
    LParentElem := LTmpXML.createNode(NODE_ELEMENT, 'SaveData', FNameSpace)  as  IXMLDOMElement;
    LParentElem.setAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');
    LTmpXML.appendChild(LParentElem);
     if   not  LXML.load(LTmpXML)  then 
      OleError(E_UNEXPECTED);
    LTmpXML :=  nil ;
    LParentElem := LXML.documentElement;
    ......................
    LError := LXML.validate;
     if  LError.errorCode <>  0   then 
       raise  Exception.Create('Помилка у вхідних даних');
    LXML.save(sdSave.FileName);
   end ;
Вот так все работает. Если бы кто объяснил почему?

С уважением, Vasilisk
...
Рейтинг: 0 / 0
Валидация при сохранении
    #35363957
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а какая сигнатура у load?
...
Рейтинг: 0 / 0
Валидация при сохранении
    #35365043
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoа какая сигнатура у load?
Не понял
...
Рейтинг: 0 / 0
Валидация при сохранении
    #35366415
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
какие типы параметров принимает?
...
Рейтинг: 0 / 0
Валидация при сохранении
    #35367577
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MSXML SDKAn indicator of the source XML to parse. This may be an URL (String/BSTR), a Request object (in an ASP page), an IStream, SAFEARRAY of bytes (VT_ARRAY|VT_UI1), a DOMDocument object, or any object that supports IStream, ISequentialStream, or IPersistStream.

С уважением, Vasilisk
...
Рейтинг: 0 / 0
Валидация при сохранении
    #35367689
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
аа… значит LTmpXML сериализуется в строку и LXML её парсит.
...
Рейтинг: 0 / 0
Валидация при сохранении
    #35367884
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и что? Вопрос в следующем, почему валидация начинает работать только после вызова load()?

С уважением, Vasilisk
...
Рейтинг: 0 / 0
Валидация при сохранении
    #35368104
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
возможно, баг, без тесткейса не разберёшься.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Валидация при сохранении
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]