C ++ в UNIX при разборе XML-файла с использованием libxml2 - PullRequest
0 голосов
/ 14 ноября 2010

Как извлечь значения узлов и атрибутов из XML-файла в C ++ с помощью libxml2 с помощью xpath?

Заранее спасибо, Бхаргава

Ответы [ 3 ]

7 голосов
/ 14 ноября 2010

Поскольку это тег C ++, я предполагаю, что вы можете использовать привязки библиотеки libxml ++.

Я написал простую программу, которая:

  • Разобрать документ, используя DomParser
  • Выполните запрос XPath, используя find() в корневом узле документа, чтобы получить доступ к атрибуту.
  • Приведите первый узел результата XPath к Attribute узлу
  • Получить значение строки этого атрибута, используя get_value()
  • Показать это значение

Вот код:

#include <iostream>
#include <libxml++/libxml++.h>

using namespace std;
using namespace Glib;
using namespace xmlpp;

int main(int argc, char* argv[])
{
    // Parse the file
    DomParser parser;
    parser.parse_file("file.xml");
    Node* rootNode = parser.get_document()->get_root_node();

    // Xpath query
    NodeSet result = rootNode->find("/root/a/b/@attr");

    // Get first node from result
    Node *firstNodeInResult = result.at(0);
    // Cast to Attribute node (dynamic_cast on reference can throw [fail fast])
    Attribute &attribute = dynamic_cast<Attribute&>(*firstNodeInResult);

    // Get value of the attribute
    ustring attributeValue = attribute.get_value();

    // Print attribute value
    cout << attributeValue << endl;
}

С учетом этого ввода:

<!-- file.xml -->
<root>
  <a>
    <b attr="I want to get this"> </b>
  </a>
</root>

Код выведет:

I want to get this

Чтобы скомпилировать это в системе Unix:

c++ `pkg-config libxml++-2.6 --cflags` `pkg-config libxml++-2.6 --libs` file.cpp
1 голос
/ 12 февраля 2016

Это пример того, как получить значение для xpath, который вы пытаетесь оценить с помощью libxml ++.

Основано на ответе Александра Жасмина, но он показывает только, как напечатать атрибут xpath, и нетривиально выяснить, как напечатать значение Node, потому что вы должны привести его к определенному объекту (также его броски ответа исключение).

#include <iostream>
#include <libxml++/libxml++.h>

using namespace std;
using namespace Glib;
using namespace xmlpp;

int main(int argc, char* argv[])
{
    // Parse the file
    DomParser parser;
    parser.parse_file("sample.xml");
    Node* root = parser.get_document()->get_root_node();

    // Xpath query
    NodeSet result = root->find("/root/ApplicationSettings/level_three");

    // Get first element from result
    Element *first_element = (Element *)result.at(0);

    // Print the content of the Element
    cout << first_element->get_child_text()->get_content() << endl;
}

sample.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<root>
    <ApplicationSettings>
        <level_three>hello world</level_three>
    </ApplicationSettings>
</root>

компилировать

g++ test.cpp -o test `pkg-config libxml++-2.6 --cflags` `pkg-config libxml++-2.6 --libs`

пробег

./test
1 голос
/ 03 августа 2011

sp1.xml:

<users noofids="1">
        <user user="vin" password="abc"/>
</users>

Программа:

#include <libxml/xpath.h>
#include <libxml/tree.h>
#include <iostream>
using namespace std;

int
main (int argc, char **argv)
{
  char ID[25];
  xmlInitParser ();
  //LIBXML_TEST_VERSION
  xmlDoc *doc = xmlParseFile ("sp1.xml");
  xmlXPathContext *xpathCtx = xmlXPathNewContext (doc);
  xmlXPathObject *xpathObj =
    xmlXPathEvalExpression ((xmlChar *) "users/user", xpathCtx);
  xmlNode *node = xpathObj->nodesetval->nodeTab[0];
  xmlAttr *attr = node->properties;
  while (attr)
    {
      //if(!xmlStrcmp(attr->name,(const xmlChar *)"noofids"))
      //sprintf(ID,"%s",attr->children->content);
      std::cout << "Attribute name: " << attr->name << "  value: " << attr->
    children->content << std::endl;
      attr = attr->next;
    }
  //std::cout<<"ID: "<<ID<<endl;
  return 0;
}

я получил вывод, попробовав самостоятельно

...