Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> XML WINAPI чтение данных, прочитать содержимое ключей 
:(
    Опции темы
XPyCT
Дата 18.3.2015, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 24.8.2007
Где: Moldova

Репутация: нет
Всего: 10



Здравствуйте

прошу помощи в чтении файла хмл
суть в том что получается считать только один узел

хмл файл 
Код

<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
  <HELLO>Привет, народ!</HELLO>
  <HELLO>Здарова, Мир!</HELLO>
</ROOT>


нужно прочитать все узлы HELLO

вот код по примеру
Код



#include<msxml.h>
#include<conio.h>
#include<stdio.h>
#include<atlbase.h>

#include<iostream>



int main(void*)
{
    setlocale(0, "");
    CComPtr<IXMLDOMDocument> xmlDoc;
    xmlDoc.CoCreateInstance(CLSID_DOMDocument);
    if (xmlDoc != NULL)
    {
        VARIANT_BOOL vBool = 0;
        HRESULT hr = xmlDoc->load(CComVariant("Hello.xml"), &vBool);
        if (SUCCEEDED(hr))
        {
            CComPtr<IXMLDOMNode> xmlNodeHello;

            xmlDoc->selectSingleNode(CComBSTR("//ROOT/HELLO"), &xmlNodeHello);
            if (xmlNodeHello != NULL)
            {
                WCHAR *text;

                xmlNodeHello->get_text(&text);
                xmlNodeHello->get_nextSibling;

                _tcprintf(_T("%s\n"), text);
            }
        }
    }


    _getch();
    return 0;
}


PM MAIL Skype   Вверх
rudolfninja
Дата 18.3.2015, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

Репутация: 1
Всего: 6



Никогда не сталкивался с этими интерфейсами, но у вас логическая ошибка.
Цитата

xmlDoc->selectSingleNode(CComBSTR("//ROOT/HELLO"), &xmlNodeHello);

Вы получаете только одного ребенка рута, первого, и далее выводите его. А вам надо получить всех.
Посмотрите в сторону метода selectNodes, он должен вернуть вам массив детей, а там уже в цикле выводите их.
PM MAIL Skype   Вверх
XPyCT
Дата 18.3.2015, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 24.8.2007
Где: Moldova

Репутация: нет
Всего: 10



в том то и дело 
вчера с этим selectNodes весь день убил и так ничего не добился
если вам не сложно разобраться с selectNodes направте на путь истинный плз =)

этот код по идее у меня должен работать в длл
ps: project Visual c++ 2013

Это сообщение отредактировал(а) XPyCT - 18.3.2015, 10:06
PM MAIL Skype   Вверх
rudolfninja
Дата 18.3.2015, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

Репутация: 1
Всего: 6



Через часик гляну, попробую разобраться.
PM MAIL Skype   Вверх
XPyCT
Дата 18.3.2015, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 24.8.2007
Где: Moldova

Репутация: нет
Всего: 10



ок жду!
PM MAIL Skype   Вверх
rudolfninja
Дата 18.3.2015, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

Репутация: 1
Всего: 6



Вот рабочий вариант
Код

#include "stdafx.h"
#include<msxml.h>
#include<conio.h>
#include<stdio.h>
#include<atlbase.h>
#include<iostream>

int _tmain(int argc, _TCHAR* argv[])
{
    CoInitialize(nullptr);
    setlocale(0, "");
    CComPtr<IXMLDOMDocument> xmlDoc;
    xmlDoc.CoCreateInstance(__uuidof(DOMDocument));
    if (xmlDoc != NULL)
    {
        VARIANT_BOOL vBool = 0;
        HRESULT hr = xmlDoc->load(CComVariant("D:\\Hello.xml"), &vBool);
        if (SUCCEEDED(hr))
        {
            CComPtr<IXMLDOMNodeList> xmlNodeList;
            CComPtr<IXMLDOMElement> element;

            xmlDoc->get_documentElement(&element);
            element->selectNodes(CComBSTR("//ROOT//HELLO"), &xmlNodeList);
            if (xmlNodeList != NULL)
            {
                long length = 0;
                xmlNodeList->get_length(&length);
                for (long i = 0; i < length; i++)
                {
                    CComPtr<IXMLDOMNode> xmlNodeHello;
                    xmlNodeList->get_item(i, &xmlNodeHello);
                    if (xmlNodeHello)
                    {

                        WCHAR *text;
                        xmlNodeHello->get_text(&text);
                        _tcprintf(_T("%s\n"), text);
                    }
                }
            }
        }
    }
    
    CoUninitialize();
    return 0;

Но тут падает AV в конце программы при вызове деструктора xmlDoc, не могу разобраться почему так.
И хорошо бы влепить проверку CComPtr<IXMLDOMElement> element; на NULL

Это сообщение отредактировал(а) rudolfninja - 18.3.2015, 12:37
PM MAIL Skype   Вверх
XPyCT
Дата 18.3.2015, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 24.8.2007
Где: Moldova

Репутация: нет
Всего: 10



спс большое
ща затестю +
PM MAIL Skype   Вверх
xvr
Дата 18.3.2015, 16:22 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(rudolfninja @  18.3.2015,  12:21 Найти цитируемый пост)
Но тут падает AV в конце программы при вызове деструктора xmlDoc, не могу разобраться почему так.

Потому что CoUninitialize случается ДО деструктора xmlDoc. Известные грабли  smile 
Возьмите все, что стоит между CoInitialize и CoUninitialize, в скобки ( {} )

PM MAIL   Вверх
rudolfninja
Дата 18.3.2015, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

Репутация: 1
Всего: 6



xvr, спасибо, буду знать.
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0532 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.