powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / странности при работе с MSXML
21 сообщений из 21, страница 1 из 1
странности при работе с MSXML
    #39788912
svd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
открыл интересный эффект в объектах, созданном 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
странности при работе с MSXML
    #39788921
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svdselectSingleNode

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

svdResponse\Result

не вижу такого тэга
...
Рейтинг: 0 / 0
странности при работе с MSXML
    #39789129
svd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пишу в топике для 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
странности при работе с MSXML
    #39789172
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svdПишу в топике для Delphi, разработка тоже под Delphi.

MSXML - Это не Delphi

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

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

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
странности при работе с MSXML
    #39789246
svd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MSXML - не Delph. MSXML - это динамическая библиотека он Майкрософта по парсингу XML-объектов. Естесственно не плохо бы узнать как включать какие либо языки, хотя в проекте это наврядли пригодится, хотя если такие артефакты появляются - значит я чего то не знаю о библиотеке. Так что жду охотно комментов.

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

По нормальному XPath в текущем проекте не использую - к нему обратиолся только потому, что более наглядно описывает где проблема лежит.
Указанный GITовский проект использует IXMLReader. Но вопрос не в этом.
В одном месте уже используется MSXML и там везде идет прямое обращение к данным через свойство nodeValue. Таких заморочек не появлялось. Тут же v DOM-объекте какая то непонятка, которую обошел, но неизвестно почему она появилась (различия в использовании объектов библиотеки только из-за дополнительного тега, но источники объектов разные и что-либо менять не реально). Да и включить XmlLite в проект проблематично из-за лицензирования (работодател в этом плане бдителен). Так что спасибо за код, длы аизучения понадобится, но использовать на прямую нельзя.
...
Рейтинг: 0 / 0
странности при работе с MSXML
    #39789262
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
странности при работе с MSXML
    #39789264
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svd, значения всех вложенных тэгов:
aDoc.selectSingleNode('Response\Result').nodeValue

равно NULL.

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

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

С еще одним партнером возникла ситуация, когда ничего для проверки нет, а нужно создать REST-клиента. В качестве основы только спецификация из PDF с указанием примеров XML-документов и XDS. Поэтому пришлось еще и свой мини-сервер изобретать, где на вот этот айсберг напоролся.
...
Рейтинг: 0 / 0
странности при работе с MSXML
    #39789588
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
странности при работе с MSXML
    #39789590
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svdвключить XmlLite в проект проблематично из-за лицензирования

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

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

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

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

По поводу валидации: как правильно проводить сию процедуру?
...
Рейтинг: 0 / 0
странности при работе с MSXML
    #39789801
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
странности при работе с MSXML
    #39790011
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svdПо поводу XMLLite: каждый код разработчика подвергается ревизии с объяснением "почему именно так".

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

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

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

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

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


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