C ++: проблема с анализом XML с использованием Libxml - PullRequest
0 голосов
/ 11 октября 2010

У меня много проблем с работой библиотеки libxml2 для разбора файла xml.

Я выполнил предыдущую похожую проблему, но столкнулся с другой.

Вот код проблемы:

class SSystem{
public:
    //Constructors
    SSystem(){};
    //Make SSystem from XML Definition. Pass ptr to node
    SSystem(xmlNodePtr Nptr, xmlDocPtr Dptr){
        name = wxString((char *)xmlGetProp(Nptr, (xmlChar*)"name"), wxConvUTF8);
        //Move to next level down, the <general> element
        Nptr = Nptr->xmlChildrenNode;
        //Move one more level down to the <radius> element
        Nptr = Nptr->xmlChildrenNode;
        //Get Radius value
        if (!xmlStrcmp(Nptr->name, (const xmlChar *)"radius")) {
            char* contents = (char*)xmlNodeGetContent(Nptr);
            std::string test1 = std::string(contents);
            radius = wxString(contents, wxConvUTF8);
        }
    }

И xmlNodePtr, и xmlDocPtr передаются в конструктор, который прекрасно работает, принимая только свойство ("имя"), но теперь задыхается от дальнейшего анализа.

Вот фрагмент рассматриваемого XML-файла:

<?xml version="1.0" encoding="UTF-8"?>
<Systems>
 <ssys name="Acheron">
  <general>
   <radius>3500.000000</radius> <-- I am trying to get this value (3500).
   <stars>300</stars>
   <asteroids>0</asteroids>
   <interference>0.000000</interference>
   <nebula volatility="0.000000">0.000000</nebula>
  </general>

Он хорошо компилируется, но вылетает при загрузке конструктора (я знаю, потому что, если я закомментирую условное условие if и char * contents = (char *) xmlNodeGetContent (Nptr-> xmlChildrenNode), он работает нормально.

Я пробовал так много разных вещей (удалил один из Nptr-> xmlChildrenNode), но ничего не работает.

Что не так?

Ответы [ 4 ]

1 голос
/ 11 октября 2010

Это:

char* contents = (char*)xmlNodeGetContent(Nptr->xmlChildrenNode)

Вероятно, должно быть так:

char* contents = (char*)xmlNodeGetContent(Nptr)
0 голосов
/ 27 сентября 2012

Я только что написал оболочку C ++ для libxml2.Это на github, если кому-то интересно: https://github.com/filipenf/libxml-cpp-wrapper

Идея состоит в том, чтобы упростить использование libxml2 для программистов на C ++ - вот основная цель этой оболочки.

В репозитории githubесть простой пример того, как его использовать, но вы можете использовать его так: string office_phone = reader.getNodes()[0]["Customer"]["ContactInfo"]["OfficePhone"].text;

Это незавершенный проект, поэтому есть много возможностей для улучшения ....

0 голосов
/ 18 октября 2010

@ Biosci3c: метод, который вы вызываете, возвращает некоторое поддельное значение.Вы не должны вызывать метод

char *) xmlNodeGetContent (Nptr-> xmlChildrenNode)

, вместо этого вы должны получить данные, соответствующие радиусу, в методе обратного вызова cdata ниже.

void cdataBlock (void * ctx, const xmlChar * value, int len)

Обратитесь к документации библиотеки libxml для справки ...

0 голосов
/ 13 октября 2010

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

Я изучаю использование MiniXML (http://www.minixml.org/).

...