Страница 1 из 2

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

Добавлено: 23 сен 2010, 17:07
Decoder
Всем привет.
Хотелось бы увидеть небольшой пример на Visual C++ с использованием данных из XML-файла.
К примеру: имеется некий файл Hello.xml
[HTML]
<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
<HELLO>Привет, народ!</HELLO>
</ROOT>
[/HTML]Как мне в нём получить строку из тега HELLO?

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

Добавлено: 23 сен 2010, 17:13
BulldozerBSG
Используй одну из библиотек tinyxml, expat, libxml2

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

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

Обе библиотеки поддерживают весь стандарт XML, включая доступ по XPath, валидация по DTD/XSD, преобразования XSLT и так далее. Если этого всего не нужно, а лишь хочется вытащить из тага текст, то вполне возможно более хорошо с точки зрения производительности будет использоваться что-нибудь маленькое и, как следствие более быстрое, например tinyxml, как указал BulldozerBSG.

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

Добавлено: 23 сен 2010, 21:16
WinMain
Вот как-то так...

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

#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;
}

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

Добавлено: 24 сен 2010, 10:20
Decoder
WinMain, ты для меня специально код написал?
Спасибо тебе огромное. :)

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

Добавлено: 13 мар 2016, 20:37
jay.k
я только начал изучение с++ и прошу помощи, как будет выглядеть аналогичный код чтения из XML-файла в dev C++ для консольного приложения? плиз хелп гуру...

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

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

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

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

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

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

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

Добавлено: 14 мар 2016, 01:42
Absurd
Когда мне приходилось читать xml из C++ я использовал expat и делал на нем конечный автомат.

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

Добавлено: 14 мар 2016, 12:04
WinMain
Библиотеки типа 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;
}