繁体   English   中英

C ++:使用Libxml解析XML时遇到麻烦

[英]C++: Trouble with Parsing XML using Libxml

使用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 *内容=(char *)xmlNodeGetContent(Nptr-> xmlChildrenNode),它可以正常运行。

我尝试了许多不同的操作(删除了Nptr-> xmlChildrenNode之一),但是没有任何效果。

怎么了?

这个:

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

应该可能是这样的:

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

我刚刚为libxml2写了一个C ++包装器。 如果有人感兴趣,它在github上: https : //github.com/filipenf/libxml-cpp-wrapper

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

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

这是一个进行中的工作,因此还有很多改进的余地。

好的,我将使用另一个XML解析库,因为Libxml对我来说有点太复杂了。

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

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

char *)xmlNodeGetContent(Nptr-> xmlChildrenNode)

相反,您必须在下面的cdata回调方法中获取与radius对应的数据。

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

查阅libxml库文档以获取参考...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM