В этой статье мы собираемся обсудить, как анализировать XML на языке программирования C ++. Мы увидим несколько рабочих примеров, чтобы понять механизм синтаксического анализа XML в C ++.
Что такое XML?
XML — это язык разметки, который в основном используется для хранения и передачи данных в организованном порядке. XML означает расширяемый язык разметки. Он очень похож на HTML. XML полностью ориентирован на хранение и передачу данных, тогда как HTML используется для отображения данных в браузере.
Пример XML-файла / XML-синтаксиса
Вот пример XML-файла:
<?xml version=«1.0» encoding=«utf-8»?>
<EmployeeData>
<Employee student_type=«Part-time»>
<Name>Tom</Name>
</Employee>
<Employee student_type=«Full-time»>
<Name>Drake</Name>
</Employee>
</EmployeeData>
В отличие от HTML, это язык разметки, ориентированный на теги, и мы можем определить свой собственный тег в файле XML. В приведенном выше примере у нас есть несколько пользовательских тегов, таких как «„. У каждого тега будет соответствующий конечный тег. “» — это конечный тег для «„. Мы можем определить столько пользовательских тегов, сколько захотим, чтобы систематизировать данные.
Разбор библиотек в C ++:
Существуют различные библиотеки для анализа XML-данных на большинстве языков программирования высокого уровня. C ++ не исключение. Вот самые популярные библиотеки C ++ для анализа XML-данных:
- RapidXML
- PugiXML
- TinyXML
Как следует из названия, RapidXML в основном ориентирован на скорость и представляет собой библиотеку синтаксического анализа в стиле DOM. PugiXML поддерживает преобразование Unicode. Вы можете использовать PugiXML, если хотите преобразовать документ UTF-16 в UTF-8. TinyXML — это минимальная версия для анализа XML-данных, которая не такая быстрая по сравнению с двумя предыдущими. Если вы хотите просто выполнить свою работу и не заботитесь о скорости, вы можете выбрать TinyXML.
Примеры
Теперь у нас есть базовое понимание XML и библиотек синтаксического анализа XML в C ++. Давайте теперь рассмотрим пару примеров для синтаксического анализа XML-файла на C ++:
- Пример-1: синтаксический анализ XML в C ++ с использованием RapidXML
- Пример-2: синтаксический анализ XML в C ++ с использованием PugiXML
- Пример-3: синтаксический анализ XML в C ++ с использованием TinyXML
В каждом из этих примеров мы будем использовать соответствующие библиотеки для анализа образца XML-файла.
Пример-1: синтаксический анализ XML в C ++ с использованием RapidXML
В этом примере программы мы продемонстрируем, как анализировать xml с помощью библиотеки RapidXML на C ++. Вот исходный XML-файл (sample.xml):
<?xml version=«1.0» encoding=«utf-8»?>
<MyStudentsData>
<Student student_type=«Part-time»>
<Name>John</Name>
</Student>
<Student student_type=«Full-time»>
<Name>Sean</Name>
</Student>
<Student student_type=«Part-time»>
<Name>Sarah</Name>
</Student>
</MyStudentsData>
Наша цель здесь — проанализировать указанный выше XML-файл с помощью C ++. Вот программа на C ++ для анализа XML-данных с помощью RapidXML. Вы можете скачать библиотеку RapidXML отсюда.
#include <iostream>
#include <fstream>
#include <vector>
#include «rapidxml.hpp»using namespace std;
using namespace rapidxml;xml_document<> doc
xml_node<> * root_node = NULL;int main(void)
{
cout << «\nParsing my students data (sample.xml)…..» << endl;// Read the sample.xml file
ifstream theFile («sample.xml»);
vector<char> buffer((istreambuf_iterator<char>(theFile)), istreambuf_iterator<char>());
buffer.push_back(‘\0‘);// Parse the buffer
doc.parse<0>(&buffer[0]);// Find out the root node
root_node = doc.first_node(«MyStudentsData»);// Iterate over the student nodes
for (xml_node<> * student_node = root_node—>first_node(«Student»); student_node; student_node = student_node—>next_sibling())
{
cout << «\nStudent Type = « << student_node—>first_attribute(«student_type»)—>value();
cout << endl;// Interate over the Student Names
for(xml_node<> * student_name_node = student_node—>first_node(«Name»); student_name_node; student_name_node = student_name_node—>next_sibling())
{
cout << «Student Name = « << student_name_node—>value();
cout << endl;
}
cout << endl;
}return 0;
}
Пример-2: синтаксический анализ XML в C ++ с использованием PugiXML
В этом примере программы мы продемонстрируем, как анализировать xml с помощью библиотеки PugiXML на C ++. Вот входной XML-файл (sample.xml):
<?xml version=«1.0» encoding=«UTF-8» standalone=«no» ?>
<EmployeesData FormatVersion=«1»>
<Employees>
<Employee Name=«John» Type=«Part-Time»>
</Employee>
<Employee Name=«Sean» Type=«Full-Time»>
</Employee>
<Employee Name=«Sarah» Type=«Part-Time»>
</Employee>
</Employees>
</EmployeesData>
В этом примере программы мы продемонстрируем, как анализировать xml с помощью библиотеки pugixml на C ++. Вы можете скачать библиотеку PugiXML отсюда.
#include <iostream>
#include «pugixml.hpp»using namespace std;
using namespace pugi;int main()
{
cout << «\nParsing employees data (sample.xml)…..\n\n«;xml_document doc;
// load the XML file
if (!doc.load_file(«sample.xml»)) return —1;xml_node tools = doc.child(«EmployeesData»).child(«Employees»);
for (xml_node_iterator it = tools.begin(); it != tools.end(); ++it)
{
cout << «Employees:»;for (xml_attribute_iterator ait = it—>attributes_begin(); ait != it—>attributes_end(); ++ait)
{
cout << » « << ait—>name() << «=» << ait—>value();
}cout << endl;
}cout << endl;
return 0;
}
Пример-3: синтаксический анализ XML в C ++ с использованием TinyXML
В этом примере программы мы продемонстрируем, как анализировать xml с помощью библиотеки TinyXML на C ++. Вот входной XML-файл (sample.xml):
<?xml version=«1.0» encoding=«utf-8»?>
<MyStudentsData>
<Student> John </Student>
<Student> Sean </Student>
<Student> Sarah </Student>
</MyStudentsData>
В этом примере программы мы продемонстрируем, как анализировать xml с помощью библиотеки TinyXML на C ++. Вы можете скачать библиотеку TinyXML отсюда.
#include <iostream>
#include <fstream>
#include <vector>
#include «tinyxml2.cpp»using namespace std;
using namespace tinyxml2;int main(void)
{
cout << «\nParsing my students data (sample.xml)…..» << endl;// Read the sample.xml file
XMLDocument doc;
doc.LoadFile( «sample.xml» );const char* title = doc.FirstChildElement( «MyStudentsData» )—>FirstChildElement( «Student» )—>GetText();
printf( «Student Name: %s\n«, title );XMLText* textNode = doc.LastChildElement( «MyStudentsData» )—>LastChildElement( «Student» )—>FirstChild()—>ToText();
title = textNode—>Value();
printf( «Student Name: %s\n«, title );return 0;
}
Заключение
В этой статье мы кратко обсудили XML и рассмотрели три различных примера синтаксического анализа XML в C ++. TinyXML — это минималистичная библиотека для анализа XML-данных. Большинство программистов в основном используют RapidXML или PugiXML для анализа XML-данных.
Как же, всё-таки, небрежно набран код — ничего не работает.