Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / странности при работе с MSXML / 21 сообщений из 21, страница 1 из 1
20.03.2019, 11:46
    #39788912
svd
svd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странности при работе с MSXML
открыл интересный эффект в объектах, созданном MSXML.

Полный текст документа следующий:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<?xml version="1.0"?>
<Response>
	<Return>1</Return>
	<MessageID>100</MessageID>
	<Message>Erforgreich</Message>
	<ID>SN_00253126_2000024492653</ID>
	<Code></Code>
	<State>ACTIVE</State>
	<Reason>SUPPLYED</Reason>
</Response>


когда задан тэг
Код: xml
1.
< ?xml ? >

, значения всех вложенных тэгов:
aDoc.selectSingleNode('Response\Result').nodeValue

равно NULL.

При этом
aDoc.selectSingleNode('Response\Result').xml
имеет значение
'
Код: xml
1.
<Response><Return>1</Return><MessageID>100</MessageID><Message>Erforgreich</Message><ID>SN_00253126_2000024492653</ID><Code></Code><State>ACTIVE</State><Reason>SUPPLYED</Reason></Response>

'

при этом aDoc.selectSingleNode('Response\Result').firstchild.nodeValue тоже равен Null, a aDoc.selectSingleNode('Response\Result').firstchild.xml равен '
Код: xml
1.
<Return>1</Return>

'.
Только aDoc.selectSingleNode('Response\Result').firstchild.text = '1'.

и уже aDoc.selectSingleNode('Response\Result').firstchild.firstchild.nodeValue равен '1'.

Какие то странные и не объяснимые логике вложения. Кто нибудь может пояснить подобную аномалию?
или знает на этот cчет что-нибудь?
...
Рейтинг: 0 / 0
20.03.2019, 11:56
    #39788921
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странности при работе с MSXML
svdselectSingleNode

на каком языке запросы? на xpath переключал, или какой-то майкрософтовский вижлбасик по умолчанию?

svdResponse\Result

не вижу такого тэга
...
Рейтинг: 0 / 0
20.03.2019, 15:53
    #39789129
svd
svd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странности при работе с MSXML
Пишу в топике для Delphi, разработка тоже под Delphi.

За опечатку извиняюсь: Копи/паств ошибка. Тест набираю латинскими буквами и перевожу программно в кирилицу - бывает что то пропускаешь. Правильный путь был aDoc.selectSingleNode('Response\Return'). Но все остальное нак как написал выше. Пришлось проверить еще раз. Так же попробовал обратный слеш на прямой поменять - результат не изменилыся.

Написал процедуру итвлечения данных с учетом такого эффекта:
Код: pascal
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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
procedure T_XMLAescudataManager.decode_XMLResponse2Rec(aDoc: IXMLDOMDocument;var aRec: T_DBAescudataExchangeRec; const aFieldType: Boolean = False);
var
  p,n : IXMLDOMNode;
  function getNodeValue(aNode: IXMLDOMNode): OLEVariant;
  begin
    Result := Null;
    if assigned(aNode) then
    begin
      if VarIsNull( aNode.nodeValue) then
      begin
        if Assigned(aNode.firstChild) then
          Result := aNode.firstChild.nodeValue
        else
          Result := aNode.text;
      end
      else
        Result := aNode.nodeValue;
    end;
  end;
begin
  p := aDoc.selectSingleNode(C_XMLAD_NODE_Response);
  if assigned(p) then
  case aFieldType of
    False:
      begin
        n := p.selectSingleNode(C_XMLAD_NODE_Return);
        if Assigned(n) then aRec.Status_Return := getNodeValue(n);
        n := p.selectSingleNode(C_XMLAD_NODE_Message + C_XMLAD_NODE_ID);
        if Assigned(n) then aRec.Status_MessageID := getNodeValue(n);
        n := p.selectSingleNode(C_XMLAD_NODE_Message);
        if Assigned(n) then aRec.Status_Message := getNodeValue(n);
        n := p.selectSingleNode(C_XMLAD_NODE_ID);
        if Assigned(n) then aRec.Status_ID := getNodeValue(n);
        n := p.selectSingleNode(C_XMLAD_NODE_Code);
        if Assigned(n) then aRec.Status_CODE := getNodeValue(n);
        n := p.selectSingleNode(C_XMLAD_NODE_State);
        if Assigned(n) then aRec.Status_STATE := getNodeValue(n);
        n := p.selectSingleNode(C_XMLAD_NODE_Reason);
        if Assigned(n) then aRec.Status_Reason := getNodeValue(n);
      end;
    True:
      begin
        n := p.selectSingleNode(C_XMLAD_NODE_Return);
        if Assigned(n) then aRec.VD_Return := getNodeValue(n);
        n := p.selectSingleNode(C_XMLAD_NODE_Message + C_XMLAD_NODE_ID);
        if Assigned(n) then aRec.VD_MessageID := getNodeValue(n);
        n := p.selectSingleNode(C_XMLAD_NODE_Message);
        if Assigned(n) then aRec.VD_Message := getNodeValue(n);
        n := p.selectSingleNode(C_XMLAD_NODE_ID);
        if Assigned(n) then aRec.VD_ID := getNodeValue(n);
        n := p.selectSingleNode(C_XMLAD_NODE_Code);
        if Assigned(n) then aRec.VD_CODE := getNodeValue(n);
        n := p.selectSingleNode(C_XMLAD_NODE_State);
        if Assigned(n) then aRec.VD_STATE := getNodeValue(n);
        n := p.selectSingleNode(C_XMLAD_NODE_Reason);
        if Assigned(n) then aRec.VD_Reason := getNodeValue(n);
      end;
  end;

end;




Но в любом случае это костыли, а не решение.
...
Рейтинг: 0 / 0
20.03.2019, 17:29
    #39789172
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странности при работе с MSXML
svdПишу в топике для Delphi, разработка тоже под Delphi.

MSXML - Это не Delphi

и у него свои языки для выборки нод (selectЛя-Ля-Ля)

вот на каком языке этот select ты пишешь? И включил ли ты его?
по умолчанию там НЕ XPath
...
Рейтинг: 0 / 0
20.03.2019, 17:36
    #39789178
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странности при работе с MSXML
Посмотри вот тут, может быть что-то интересное найдёшь

https://github.com/the-Arioch/Delphi-XmlLite/tree/master/Samples/Excel XML-SS Read Speed Test

TXmlDocument - это обёртка поверх MS XML в DOM-режиме. Соотв. там куски, разворачивающие эту обёртку, для тебя лишние, но остальное может что-то подсказать полезное

Сравни работу с XPath в нём и в OmniXML , если конечно у тебя XPath, а не другой язык выборки из XML
...
Рейтинг: 0 / 0
20.03.2019, 20:11
    #39789246
svd
svd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странности при работе с MSXML
MSXML - не Delph. MSXML - это динамическая библиотека он Майкрософта по парсингу XML-объектов. Естесственно не плохо бы узнать как включать какие либо языки, хотя в проекте это наврядли пригодится, хотя если такие артефакты появляются - значит я чего то не знаю о библиотеке. Так что жду охотно комментов.

В дельфе есть свой парсер XML, но MSXML уже раз используется в других местах проекта и сооружать есше один велосипед было бы глупо.

По нормальному XPath в текущем проекте не использую - к нему обратиолся только потому, что более наглядно описывает где проблема лежит.
Указанный GITовский проект использует IXMLReader. Но вопрос не в этом.
В одном месте уже используется MSXML и там везде идет прямое обращение к данным через свойство nodeValue. Таких заморочек не появлялось. Тут же v DOM-объекте какая то непонятка, которую обошел, но неизвестно почему она появилась (различия в использовании объектов библиотеки только из-за дополнительного тега, но источники объектов разные и что-либо менять не реально). Да и включить XmlLite в проект проблематично из-за лицензирования (работодател в этом плане бдителен). Так что спасибо за код, длы аизучения понадобится, но использовать на прямую нельзя.
...
Рейтинг: 0 / 0
20.03.2019, 21:05
    #39789262
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странности при работе с MSXML
Ariochпо умолчанию там НЕ XPath https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ms754679(v=vs.85) In MSXML 3.0 only, the default for this property is "XSLPattern"; however, you can set this property to "XPath" to switch the query language from XSLPattern to XPath. Once the property is set, there is no way to switch back without creating an instance of a new DOM object.

For MSXML 4.0 and later, only a value of "XPath" is recognized as XPath is the only query language supported and therefore, this property can be ignored.
...
Рейтинг: 0 / 0
20.03.2019, 21:11
    #39789264
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странности при работе с MSXML
svd, значения всех вложенных тэгов:
aDoc.selectSingleNode('Response\Result').nodeValue

равно NULL.

При этом
aDoc.selectSingleNode('Response\Result').xml
имеет значениеТак и должно быть тынц , тынц
...
Рейтинг: 0 / 0
21.03.2019, 10:34
    #39789407
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странности при работе с MSXML
Вообще судя по RFC, версия должна присутствовать. Так что парсер вовсе не обязан корректно работать с таким огрызком
...
Рейтинг: 0 / 0
21.03.2019, 13:33
    #39789555
svd
svd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странности при работе с MSXML
спасобо большое. укакзанные ссылки многое объясняют.

С первым использованием MSXML была еще работа по собиранию документа на основе данных. То есть банальное createElement и присвоение значения в nodeValue. Вероятно это тоже играет свою роль. Но там от "производителя" был тул для тестирования, который напроч не понимал тэг "xml", хотя для некоторых изысканий требовалось создать документы версии 1.1. Руководство настояло, что лучше использовать парсер от майкрософта, чем выслушивать подозрения от партнеров, что что-то не работает. Тем более с партнерами все тестили - проблем не возникало.

С еще одним партнером возникла ситуация, когда ничего для проверки нет, а нужно создать REST-клиента. В качестве основы только спецификация из PDF с указанием примеров XML-документов и XDS. Поэтому пришлось еще и свой мини-сервер изобретать, где на вот этот айсберг напоролся.
...
Рейтинг: 0 / 0
21.03.2019, 14:21
    #39789588
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странности при работе с MSXML
https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ms754679(v=vs.85) For MSXML 4.0 and later, only a value of "XPath" is recognized as XPath is the only query language supported and therefore, this property can be ignored.

Это приятно. Но тогда нужно проверять версию MS XML (завязывтаься на особенности реализации) - что, в общем, не проще, явного включения нужного языка.
...
Рейтинг: 0 / 0
21.03.2019, 14:25
    #39789590
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странности при работе с MSXML
svdвключить XmlLite в проект проблематично из-за лицензирования

XMLLite - часть Windows XP
Какое нафиг лицензирование....

svdУказанный GITовский проект использует IXMLReader.
Это просто абстракция поверх трёх XML-библиотек с целью измерить и сравнить скорость.
В процессе - нашлись и исправились несколько багов в OmniXML

Этот проект был - просто демонстрация работающего кода с MS XML и в том ичсле с MS XML XPath и в том числе с XML namespaces от которых MS XML XPath сильно зависим
...
Рейтинг: 0 / 0
21.03.2019, 15:52
    #39789693
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странности при работе с MSXML
AriochНо тогда нужно проверять версию MS XMLЯ сразу указываю CLSID_FreeThreadedDOMDocument60. Ибо нужно поддержка XSD, которой в 3.0 не было
...
Рейтинг: 0 / 0
21.03.2019, 15:53
    #39789698
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странности при работе с MSXML
svdс указанием примеров XML-документов и XDSПросто мечта! Валидируете XML схемой и сразу отлавливаете все ошибки
...
Рейтинг: 0 / 0
21.03.2019, 18:01
    #39789777
svd
svd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странности при работе с MSXML
По поводу версии библиотки: сразу указываю CoDOMDocumet60.Create. Так что все должно подхватываться.

По поводу XMLLite: каждый код разработчика подвергается ревизии с объяснением "почему именно так". Если где-то находится строчка copyright, то дополнительные процедуры проверки соотвествия лицензии и куча других малоприятных мероприятий, которые нужно пройти. Но за учебное пособие - большое спасибо. (ПС: вдокументе MSXML не нашел функции сохранения текста документа с табуляцией, м дельфийском документе - есть. Поэтому в отладочном режиме проводит конвертацию документов, что не есть хорошо).

По поводу валидации: как правильно проводить сию процедуру?
...
Рейтинг: 0 / 0
21.03.2019, 18:48
    #39789801
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странности при работе с MSXML
svdвдокументе MSXML не нашел функции сохранения текста документа с табуляциейНет ее. А вам зачем? Открываете сохраненный xml в браузере и смотрите
svdПо поводу валидации: как правильно проводить сию процедуру?В чем именно вопрос? Подключаете схему и валидируете.

Вот код на JS. В Delphi переводится один в один
Код: javascript
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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
var schemaCache = new ActiveXObject("MSXML2.XMLSchemaCache.6.0");

for (var i=1; i < WScript.Arguments.length; i++) {
  // schemaSource is used to load schema documents
  // Currentl create a new object for each schema document as I don't know if the cache makes copies
  var schemaSource = new ActiveXObject ( "MSXML2.DOMDocument.6.0" );
  schemaSource.async = false;
  schemaSource.validateOnParse = false;
  schemaSource.setProperty("ResolveExternals", true); 

  // load the schema document
  if (schemaSource.load(WScript.Arguments.Item(i))) {
    try {
      // Set up XPath
      schemaSource.setProperty("SelectionLanguage", "XPath");
      schemaSource.setProperty("SelectionNamespaces", "xmlns:a='http://www.w3.org/2001/XMLSchema'");

        // extract the targetNamespace attribute from the schema using XPath
        var tnsattr = schemaSource.selectSingleNode("/a:schema/@targetNamespace");
        var nsuri = (tnsattr) ? tnsattr.nodeValue : '';

        // add the schema to the cache
        schemaCache.add ( nsuri, schemaSource );
    } catch (e) {
      WScript.echo("Exception adding schema to cache");
      WScript.echo(e.description);
    }
  } else {
      WScript.echo("Schema error");
      WScript.echo("### error: " + schemaSource.parseError.reason);
      WScript.echo("### source: " + schemaSource.parseError.srcText);
      WScript.echo("### line: " + schemaSource.parseError.line);
  }
}
  
try {
  // attach the schema cache to a DOM
  var xmlSource = new ActiveXObject("MSXML2.DOMDocument.6.0");
  xmlSource.schemas = schemaCache;
  // load XML document
  xmlSource.async = false;
  xmlSource.validateOnParse = true;
  xmlSource.setProperty("MultipleErrorMessages", true); 

  if (xmlSource.load(WScript.Arguments.Item(0))) 
    WScript.echo("success: Document conforms to the Schema");
  else {
    WScript.echo("Instance error" );
    LAllErrors = xmlSource.parseError.allErrors;
    for (i = 0; i < LAllErrors.length; i++) {
      LError = LAllErrors.item(i);
      WScript.echo("### Reason: " + LError.reason +
        "\n### XPath: " + LError.errorXPath +
        "\n### line: " + LError.line +
        "\n### SrcText: " + LError.srcText);
    }
  }
} catch (e) {
  WScript.echo("Exception loading instance document");
  WScript.echo(e.description);
}

...
Рейтинг: 0 / 0
22.03.2019, 12:56
    #39790011
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странности при работе с MSXML
svdПо поводу XMLLite: каждый код разработчика подвергается ревизии с объяснением "почему именно так".

XMLLite хорош огроменной скоростью при крохотном расходе памяти (в отличие от DOM), и при этом несколько проще SAX'a ( как писать циклы для нас проще, чем бесконечно-рекурсивные функции, а писать if-ы проще, чем конечные автоматы с событиями )

Но он совсем не так нагляден, как DOM

Что до copyright - я уже точно не помню.
Половина - просто перевод на Паскаль Windows SDK - там вообще копирайта нету.
Немножечко крохотных функций-хелперов поверх них - они вообще не стоят лицензии, но я мог какую-то и указать чтобы было, точно не помню - давно это было. В любом случае, они не обязательны, чисто для удобства.
Были ли какие-то функции-хелперы в апстриме, который я форкнул... Вот вообще не помню, но они тоже не обязательны
...
Рейтинг: 0 / 0
22.03.2019, 12:57
    #39790012
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странности при работе с MSXML
Кстати, линуксоиды в треде есть? под Линух кто-то писал XmlLite тоже, если потестируете скорость в сравнении с виндовым - было бы интересно, слегка.
...
Рейтинг: 0 / 0
23.03.2019, 00:03
    #39790337
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странности при работе с MSXML
Arioch,

под винду и линукс, delphi и fpc/лазарь хорошо работают жедаевские xml компоменты, TJclSimpleXML.
Порт, если что, тут:
https://github.com/Makhaon/jcl
...
Рейтинг: 0 / 0
23.03.2019, 09:27
    #39790366
ziv-2014
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странности при работе с MSXML
makhaon,
TJclSimpleXML течет, если есть ошибки в XML.
...
Рейтинг: 0 / 0
23.03.2019, 10:34
    #39790378
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странности при работе с MSXML
ziv-2014,

если есть тестовый ошибочный xml на котором течет, то можешь кинуть, гляну, может найду концы.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / странности при работе с MSXML / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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