【问题标题】:C++: Trouble with Parsing XML using LibxmlC++:使用 Libxml 解析 XML 的问题
【发布时间】:2011-04-23 14:57:57
【问题描述】:

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

怎么了?

【问题讨论】:

  • 我认为崩溃是由于分段错误造成的,所以带有指针的东西出了问题。
  • 有人吗?还有其他建议吗?

标签: c++ libxml2 xml-parsing


【解决方案1】:

这个:

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

应该是这样的:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 哦,是的,这对我来说更容易理解。
    【解决方案3】:

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

    char*)xmlNodeGetContent(Nptr->xmlChildrenNode)

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

    void cdataBlock (void * ctx, 常量 xmlChar * 值, 国际化)

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

    【讨论】:

      【解决方案4】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-08
        • 1970-01-01
        • 1970-01-01
        • 2021-08-15
        • 2013-09-23
        • 2012-10-12
        相关资源
        最近更新 更多