C ++ Parse XML с использованием STD - PullRequest
3 голосов
/ 09 февраля 2010

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

У меня есть программа, которая создала этот файл XML.

<theKey>
<theValue>23432</theValue>
</theKey>

То, что я пытаюсь сделать, это разобрать "23432" между тегами.Однако в файле есть случайные теги, поэтому они не всегда могут быть во второй строке сверху.Кроме того, я не знаю, сколько цифр число между тегами.

Вот код, который я разработал до сих пор.Это основа, потому что я не знаю, что я могу использовать, это часть языка C ++, которая будет анализировать значение.Мой совет от меня, работающего с JAVA, состоит в том, чтобы использовать что-то из библиотеки "String", но пока я не могу понять, что я могу использовать.

Кто-нибудь может дать мне направление или подсказку, что я могу сделать / использовать?Большое спасибо.

Вот код, который я разработал до сих пор:

#include <iostream>
#include <fstream>
#include <string>

using std::cout;
using std::cin;
using std::endl;
using std::fstream;
using std::string;
using std::ifstream;


int main()
{
 ifstream inFile;
 inFile.open("theXML.xml");

 if (!inFile)
 {
 }

 string x;
 while (inFile >> x)
 {
  cout << x << endl;
 }

 inFile.close();

 system ( "PAUSE" );


 return 0;
}

Ответы [ 4 ]

6 голосов
/ 09 февраля 2010

Чтобы проанализировать произвольный XML, вам действительно нужен правильный анализатор XML. Когда вы включаете все nooks для символьной модели и DTD, связанные с DTD языка, это совсем не просто для синтаксического анализа, и это ужасная ошибка - писать анализатор, который понимает только произвольное подмножество XML.

В реальном мире было бы неправильно использовать что-либо кроме правильной библиотеки XML-анализатора для реализации этого. Если вы не можете использовать библиотеку и не можете изменить формат вывода программы на что-то более простое для анализа (например, разделенные новой строкой пары ключ / значение), вы находитесь в невыгодном положении. Любой школьный проект, требующий синтаксического анализа XML без синтаксического анализатора XML, полностью ошибочен.

(Ну, если весь смысл проекта в том, чтобы написать синтаксический анализатор XML на C ++. Но это было бы очень жестоким заданием.)

4 голосов
/ 09 февраля 2010

Вот схема того, как должен выглядеть ваш код (я упустил утомительные части в качестве упражнения):

std::string whole_file;

// TODO:  read your whole XML file into "whole_file"

std::size_t found = whole_file.find("<theValue>");

// TODO: ensure that the opening tag was actually found ...

std::string aux = whole_file.substr(found);
found = aux.find(">");

// TODO: ensure that the closing angle bracket was actually found ...

aux = aux.substr(found + 1);

std::size_t end_found = aux.find("</theValue>");

// TODO: ensure that the closing tag was actually found ...

std::string num_as_str = aux.substr(0, end_found); // "23432"

int the_num;

// TODO: convert "num_as_str" to int

Конечно, это не правильный синтаксический анализатор XML, просто что-то быстрое и грязное, которое решает вашу проблему.

2 голосов
/ 09 февраля 2010

Стандартная библиотека C ++ не предоставляет функций синтаксического анализа XML. Если вы хотите написать это самостоятельно, я предлагаю посмотреть на std :: geline () для чтения ваших данных в строки (не пытайтесь использовать оператор >> для этого), а затем в базовом классе std :: string функции, такие как функция substr (), чтобы измельчить его. Но имейте в виду, что написание собственного синтаксического анализатора XML, даже базового, очень далеко не тривиально.

2 голосов
/ 09 февраля 2010

Вам нужно будет создать функции как минимум:

  • Если узел является контейнерным, то
    • Идентификация / анализ элементов (начала и конца) и атрибутов, если таковые имеются
    • Рекурсивно разбирать детей
  • В противном случае извлекать значение при усечении конечных и начальных пробелов, если они есть, если они не значимы

std::string предоставляет несколько полезных функций-членов, таких как: find, find_first_of, substr и т. Д. Попробуйте использовать их в своих функциях.

...