C ++:使用Libxml解析XML的麻烦

时间:2010-10-11 02:28:41

标签: c++ libxml2 xml-parsing

使用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都传递给构造函数,只需要一个属性(“name”)就可以正常工作,但现在正在进行进一步的解析。

以下是有问题的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-&gt; xmlChildrenNode),它运行正常。< / p>

我尝试了很多不同的东西(删除了一个Nptr-&gt; xmlChildrenNode),但没有任何作用。

有什么问题?

4 个答案:

答案 0 :(得分:1)

此:

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

应该是这样的:

char* contents = (char*)xmlNodeGetContent(Nptr)

答案 1 :(得分:0)

好的,我将使用不同的XML解析库,因为Libxml对我来说有点过于复杂。

我正在研究使用MiniXML(http://www.minixml.org/)。

答案 2 :(得分:0)

@ Biosci3c:  您调用的方法返回一些假值。你不应该调用方法

的char *)xmlNodeGetContent(Nptr-&GT; xmlChildrenNode)

相反,你必须在下面的cdata回调方法中得到与radius相对应的数据。

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

查看libxml库文档以供参考...

答案 3 :(得分:0)

我刚刚给libxml2写了一个C ++包装器。如果有人有兴趣,请访问github:https://github.com/filipenf/libxml-cpp-wrapper

我们的想法是让C ++程序员更容易使用libxml2 - 这是这个包装器的主要目标。

在github存储库中有一个如何使用它的简单示例,但您可以像这样使用它: string office_phone = reader.getNodes()[0]["Customer"]["ContactInfo"]["OfficePhone"].text;

这是一项正在进行中的工作,因此有很多改进空间......