C++:使用 Libxml 解析 XML 时出现问题

发布于 2024-09-27 05:46:06 字数 1593 浏览 2 评论 0原文

我在使用 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 之一),但没有任何效果,

有什么问题吗?

I am having a lot of trouble working with the libxml2 library to parse an xml file.

I have weeded out a previous, similar problem, but have run into another.

Here is the problem code:

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);
        }
    }

Both an xmlNodePtr and an xmlDocPtr are passed to the constructor, which works fine taking just a property ("name"), but is now choking on further parsing.

Here is a piece of the xml file in question:

<?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>

It compiles fine, but crashes when the constructor is loaded (I know because, if I comment out the if conditional and the char* contents = (char*)xmlNodeGetContent(Nptr->xmlChildrenNode), it runs fine.

I've tried so many different things (removed one of the Nptr->xmlChildrenNode), but nothing works.

What is wrong?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

归属感 2024-10-04 05:46:06

这个:

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

大概应该是这样:

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

This:

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

Should probably be this:

char* contents = (char*)xmlNodeGetContent(Nptr)
祁梦 2024-10-04 05:46:06

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

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

Okay, I am going to use a different XML parsing library, as Libxml is a bit too complicated for me.

I am looking into using MiniXML (http://www.minixml.org/).

高冷爸爸 2024-10-04 05:46:06

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

char*)xmlNodeGetContent(Nptr->xmlChildrenNode)

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

无效cdataBlock(无效* ctx,
const xmlChar * 值,
int len)

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

@Biosci3c:
The method you are calling returns some fake value. You should not call the method

char*)xmlNodeGetContent(Nptr->xmlChildrenNode)

instead you have to get the data corresponding to radius in cdata callback method below here.

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

Check out in libxml library documentation for reference...

十级心震 2024-10-04 05:46:06

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

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

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

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

I just wrote a C++ wrapper to libxml2. It is on github if someone is interested: https://github.com/filipenf/libxml-cpp-wrapper

The idea is to make the use of libxml2 easier for C++ programmers - that's the main goal of this wrapper.

In the github repository there is a simple example of how to use it, but you can use it like this:
string office_phone = reader.getNodes()[0]["Customer"]["ContactInfo"]["OfficePhone"].text;

It is a work-in-progress so there is many room for improvement....

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文