XML работает, XML+XSD - нет
От: sushko Россия  
Дата: 08.12.15 18:34
Оценка:
Есть у меня XML (см. ниже). Я его пытаюсь прочитать при помощи MsXmlEngine/C++ примерно следующим образом:

CoCreateInstance(__uuidof(DOMDocument60), NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&m_pDocument));
m_pDocument->put_async(VARIANT_FALSE);  
m_pDocument->put_validateOnParse(VARIANT_FALSE);
m_pDocument->put_resolveExternals(VARIANT_FALSE);
m_pDocument->load(varFileName, &varStatus);
m_pDocument->selectNodes((bstr_t)"//Documents/Document/TTNInformBReg/Header/*", &pNodes);
long lCount = 0;
pNodes->get_length(&lCount);


то в результате lCount становится равным нулю. Если же в исходном XML срубить все ссылки на XSD, то lCount после исполнения кода выше показывает то, что должен показывать.

Что я делаю не так?

P.S. И исходный XML, и XML с отрезанными XSD в IE замечатально открывается.

Вот исходный XML:

<ns:Documents xmlns:wbr="http://fsrar.ru/WEGAIS/TTNInformBReg" xmlns:pref="http://fsrar.ru/WEGAIS/ProductRef" xmlns:oref="http://fsrar.ru/WEGAIS/ClientRef" xmlns:ns="http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ns:Owner>
<ns:FSRAR_ID>3463047</ns:FSRAR_ID>
</ns:Owner>
<ns:Document>
<ns:TTNInformBReg>
<wbr:Header xmlns:wbr="http://fsrar.ru/WEGAIS/TTNInformBReg" xmlns:pref="http://fsrar.ru/WEGAIS/ProductRef" xmlns:oref="http://fsrar.ru/WEGAIS/ClientRef" xmlns:ns="http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<wbr:Identity>1</wbr:Identity>
<wbr:WBRegId>0000002167</wbr:WBRegId>
<wbr:EGAISFixNumber>201500000000002</wbr:EGAISFixNumber>
<wbr:EGAISFixDate>2015-03-18</wbr:EGAISFixDate>
<wbr:WBNUMBER>9999</wbr:WBNUMBER>
<wbr:WBDate>2015-02-16</wbr:WBDate>
<wbr:Shipper>
<oref:ClientRegId>00040218</oref:ClientRegId>
<oref:INN>0260009319</oref:INN>
<oref:KPP>026001001</oref:KPP>
<oref:FullName>Общество с Ограниченной ответственностью &quot;Радуга&quot;(Магазин)</oref:FullName>
<oref:ShortName>Радуга</oref:ShortName>
<oref:address>
<oref:Country>643</oref:Country>
<oref:RegionCode>02</oref:RegionCode>
<oref:description>643,,Москва ул. Большие пробки,31/1,,,</oref:description>
</oref:address>
</wbr:Shipper>
<wbr:Consignee>
<oref:ClientRegId>00040217</oref:ClientRegId>
<oref:INN>5907027035</oref:INN>
<oref:KPP>590701001</oref:KPP>
<oref:FullName>ООО &quot;Кое-Как&quot; (склад)</oref:FullName>
<oref:ShortName>?</oref:ShortName>
<oref:address>
<oref:Country>643</oref:Country>
<oref:RegionCode>59</oref:RegionCode>
<oref:description>643,,Москва, Спартаковская,12,,,</oref:description>
</oref:address>
</wbr:Consignee>
</wbr:Header>
<wbr:Content xmlns:wbr="http://fsrar.ru/WEGAIS/TTNInformBReg" xmlns:pref="http://fsrar.ru/WEGAIS/ProductRef" xmlns:oref="http://fsrar.ru/WEGAIS/ClientRef" xmlns:ns="http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<wbr:Position>
<wbr:Identity>1</wbr:Identity>
<wbr:InformBRegId>000000000002142</wbr:InformBRegId>
</wbr:Position>
</wbr:Content>
</ns:TTNInformBReg>
</ns:Document>
</ns:Documents>
Бесплатный генератор отчетов для программ на C/C++
http://www.oxetta.com
Отредактировано 08.12.2015 18:35 sushko . Предыдущая версия .
Re: XML работает, XML+XSD - нет
От: sushko Россия  
Дата: 10.12.15 09:48
Оценка:
Здравствуйте, sushko, Вы писали:

S>Есть у меня XML (см. ниже). Я его пытаюсь прочитать при помощи MsXmlEngine/C++ примерно следующим образом:


В другой ветке подсказали решение: http://stackoverflow.com/questions/21301899/ixmldomdocumentselectnodes-doesnt-work-as-expected
Бесплатный генератор отчетов для программ на C/C++
http://www.oxetta.com
Re[2]: XML работает, XML+XSD - нет
От: Mr.Delphist  
Дата: 14.12.15 17:07
Оценка:
Здравствуйте, sushko, Вы писали:

S>Здравствуйте, sushko, Вы писали:


S>>Есть у меня XML (см. ниже). Я его пытаюсь прочитать при помощи MsXmlEngine/C++ примерно следующим образом:


S>В другой ветке подсказали решение: http://stackoverflow.com/questions/21301899/ixmldomdocumentselectnodes-doesnt-work-as-expected


Совершенно верно — неймспейсы. Если они есть, опускать их нельзя. Сам время от времени собираю эту граблю
Re[3]: XML работает, XML+XSD - нет
От: sushko Россия  
Дата: 06.06.16 10:25
Оценка:
Hi, All!

Неймспейсы, серия вторая. Предположим, у меня есть XML такой, как описан в первом сообщении в топике, в этом случае после вызова:

m_pDocument->SetProperty("SelectionNamespaces", "xmlns:ns= 'http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01'");


я могу получить путь к нужному мне XML-узлу с документом-накладной как "ns:Document".

Но что делать, если одна Очень Умная Программа дает при создании XML неймспейсам не рекомендованные префиксы ("ns" в примере выше), а что какие-то свои, например, "d3p1" вместо "ns"? Нет, ну то есть понятно, что в этом случае я должен запрашивать путь "d3p1:Document" вместо "ns:Document", но откуда мне угадать, что в этом пути надо поставить именно префикс "d3p1"? Учитывая, что я должен перед парсингом документа указать парсеру эти префиксы в SetProperty() (см. выше)?

Т.е. получается, что для того, чтобы узнать префиксы, я должен распарсить документ, а для того, чтобы распарсить документ, я должен узнать префиксы
Бесплатный генератор отчетов для программ на C/C++
http://www.oxetta.com
Re[4]: XML работает, XML+XSD - нет
От: sushko Россия  
Дата: 06.06.16 10:45
Оценка:
Hi, All!

Туда же вдогонку: "правильный" документ начинается так:

<ns:Documents xmlns:wb="http://fsrar.ru/WEGAIS/TTNSingle" xmlns:pref="http://fsrar.ru/WEGAIS/ProductRef" xmlns:oref="http://fsrar.ru/WEGAIS/ClientRef" xmlns:ns="http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01">


"Неправильный" документ начинается так:

<Documents xmlns="http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Version="1.0">


Могу ли я говорить, что у этих двух документов разная структура?
Бесплатный генератор отчетов для программ на C/C++
http://www.oxetta.com
Re[5]: XML работает, XML+XSD - нет
От: Mr.Delphist  
Дата: 06.06.16 10:59
Оценка:
Здравствуйте, sushko, Вы писали:

S>Могу ли я говорить, что у этих двух документов разная структура?


Конечно, разная. Ладно бы просто были разные префиксы для одних и тех же неймспейсов — от перестановки слагаемых сумма не меняется. Но тут реально только один общий неймспейс http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01 (который с префиксом ns для первого документа и дефолтный неймспейс для второго), остальное всё разное.

P.S. Посмотрев, куда указывают эти неймспейсы, я не удивлюсь, если там XML ручками собирают через конкатенацию строк. Само собой, тогда получается просто текстовый документ, а не XML stream.
Re[6]: XML работает, XML+XSD - нет
От: sushko Россия  
Дата: 06.06.16 12:41
Оценка:
А если бы структура была одинаковая, но с разными префиксами, то как при помощи MSXML мне ее надо было бы читать? Ведь узел "Documents" может называться и "ns:Documents", и "d3p1:Documents", и как угодно еще? Как мне получить доступ к этому узлу, учитывая, что на момент компиляции своей программы я не знаю префикса? Как мне получить этот префикс из XML-документа?
Бесплатный генератор отчетов для программ на C/C++
http://www.oxetta.com
Отредактировано 06.06.2016 12:42 sushko . Предыдущая версия .
Re[7]: XML работает, XML+XSD - нет
От: dead0k  
Дата: 09.06.16 11:47
Оценка:
Здравствуйте, sushko, Вы писали:

S>А если бы структура была одинаковая, но с разными префиксами, то как при помощи MSXML мне ее надо было бы читать? Ведь узел "Documents" может называться и "ns:Documents", и "d3p1:Documents", и как угодно еще? Как мне получить доступ к этому узлу, учитывая, что на момент компиляции своей программы я не знаю префикса? Как мне получить этот префикс из XML-документа?

Не скажу за msxml, но в нормальных парсерах все просто.
uri схемы у тебя есть, имя ноды у тебя есть.
биндишь uri к произвольному префиксу, составляешь xpath запрос с этим префиксом:
    m_pDocument->SetProperty("SelectionNamespaces", "xmlns:MyCoolNamespacePrefix= 'http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01'")
    m_pDocument->selectNodes((bstr_t)"//MyCoolNamespacePrefix:Documents/MyCoolNamespacePrefix:Document/MyCoolNamespacePrefix:TTNInformBReg/MyCoolNamespacePrefix:Header/*", &pNodes);

за корректность синтаксиса не ручаюсь.
Re[8]: XML работает, XML+XSD - нет
От: sushko Россия  
Дата: 09.06.16 19:05
Оценка:
Здравствуйте, dead0k, Вы писали:

D>биндишь uri к произвольному префиксу, составляешь xpath запрос с этим префиксом:


То ли в MSXML так не работает, то ли структура документа "у врага" действительно другая. Проверить под отладчиком не могу, т.к. оригинального XML-документа у меня нет, есть только на компьютере пользователя, которого я даже не помню, как зовут.
Бесплатный генератор отчетов для программ на C/C++
http://www.oxetta.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.