Пример чтения данных из XML-файла

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Аватара пользователя
Decoder
Сообщения: 308
Зарегистрирован: 19 фев 2008, 23:11
Откуда: Moscow

Всем привет.
Хотелось бы увидеть небольшой пример на Visual C++ с использованием данных из XML-файла.
К примеру: имеется некий файл Hello.xml
[HTML]
<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
<HELLO>Привет, народ!</HELLO>
</ROOT>
[/HTML]Как мне в нём получить строку из тега HELLO?
Поумнеть несложно, куда труднее от дури избавиться.
BulldozerBSG
Сообщения: 270
Зарегистрирован: 09 янв 2010, 04:14
Контактная информация:

Используй одну из библиотек tinyxml, expat, libxml2
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Если на Windows, то ещё вариант msxml. Им чаще всего пользуются, если не нужно заботиться о кроссплатформенности кода. Если кроссплатформенный вариант - то xerces.

Обе библиотеки поддерживают весь стандарт XML, включая доступ по XPath, валидация по DTD/XSD, преобразования XSLT и так далее. Если этого всего не нужно, а лишь хочется вытащить из тага текст, то вполне возможно более хорошо с точки зрения производительности будет использоваться что-нибудь маленькое и, как следствие более быстрое, например tinyxml, как указал BulldozerBSG.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Вот как-то так...

Код: Выделить всё

#include "stdafx.h"
#include <msxml.h>
#include <conio.h>
 
struct _CO_INITIALIZE
{
  _CO_INITIALIZE()
  {
    ::CoInitialize(NULL);
  }
  ~_CO_INITIALIZE()
  {
    ::CoUninitialize();
  }
} co_init;
 
int _tmain(int argc, _TCHAR* argv[])
{
  CComPtr<IXMLDOMDocument> xmlDoc;
  xmlDoc.CoCreateInstance(CLSID_DOMDocument);
  if (xmlDoc != NULL)
  {
    VARIANT_BOOL vBool = 0;
    HRESULT hr = xmlDoc->load(CComVariant(L"Hello.xml"), &vBool);
    if (SUCCEEDED(hr))
    {
      CComPtr<IXMLDOMNode> xmlNodeHello;
      xmlDoc->selectSingleNode(CComBSTR(L"ROOT/HELLO"), &xmlNodeHello);
      if (xmlNodeHello != NULL)
      {
        CComBSTR text;
        xmlNodeHello->get_text(&text);
        _tcprintf(_T("%s\n"), text);
      }
    }
  }
  //
  _gettch();
 
  return 0;
}
Аватара пользователя
Decoder
Сообщения: 308
Зарегистрирован: 19 фев 2008, 23:11
Откуда: Moscow

WinMain, ты для меня специально код написал?
Спасибо тебе огромное. :)
Поумнеть несложно, куда труднее от дури избавиться.
jay.k
Сообщения: 3
Зарегистрирован: 13 мар 2016, 20:31

я только начал изучение с++ и прошу помощи, как будет выглядеть аналогичный код чтения из XML-файла в dev C++ для консольного приложения? плиз хелп гуру...
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Вряд ли новичок сможет использовать технологию COM (msxml) в семействе компиляторов GNU (dev c++). Не уверен что это вообще возможно. Лучше использовать expat или tinyxml.
2B OR NOT(2B) = FF
jay.k
Сообщения: 3
Зарегистрирован: 13 мар 2016, 20:31

Absurd писал(а):Вряд ли новичок сможет использовать технологию COM (msxml) в семействе компиляторов GNU (dev c++). Не уверен что это вообще возможно. Лучше использовать expat или tinyxml.

спасибо что откликнулись! а какой самый простой способ прочесть "Привет, народ!" из этого xml файла?

<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
<HELLO>Привет, народ!</HELLO>
</ROOT>
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Когда мне приходилось читать xml из C++ я использовал expat и делал на нем конечный автомат.
2B OR NOT(2B) = FF
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Библиотеки типа Expat, LibXml2, и другие - это в основном набор функций для языка СИ. Ими не так удобно пользоваться, как готовыми классами С++. Поэтому лучше сразу поискать классы-обёртки для этих библиотек или попытаться подключить в проект целый фрэймворк, в котором уже имеются классы для работы с XML.
Вот как это можно сделать с помощью кросс-платформенного фрэймворка wxWidgets

Код: Выделить всё

#include <iostream>
#include <wx\wx.h>
#include <wx\xml\xml.h>
#include <locale.h>

_TCHAR* lc = _tsetlocale(LC_ALL, _T("russian"));

int _tmain(int argc, _TCHAR* argv[])
{
	wxInitializer init(argc, argv);

	/* Чтение из XML... */ 
	wxXmlDocument xml(wxT("Hello.xml"));
	if (xml.IsOk())
	{
		wxXmlNode *pRoot = xml.GetRoot();
		if (pRoot != NULL)
		{
			wxXmlNode *pChild = pRoot->GetChildren();
			while (pChild != NULL)
			{
				wxString name = pChild->GetName();
				if (name == wxT("HELLO"))
				{
					wxString text = pChild->GetNodeContent();
					wxPrintf(wxT("%s\t"), text);
					break;
				}
				pChild = pChild->GetNext();
			}
		}
	}

	cin.get();
	//
	return 0;
}
Ответить