使用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),但没有任何作用。
有什么问题?
答案 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;
这是一项正在进行中的工作,因此有很多改进空间......