[英]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.