【问题标题】:TinyXML getting ValueTinyXML 获得价值
【发布时间】:2013-02-19 00:28:19
【问题描述】:

给定的 XML 如下:

<a>
    <result>0</result>
    <data>I9C3J9N3cCTZdKGK+itJW1Q==</data>
</a>

我需要知道&lt;result&gt; 为 0 并对其采取行动。

我在做:

TiXmlDocument doc;
bool bOK = doc.Parse((const char*)chunk.memory, 0, TIXML_ENCODING_UTF8);
if (bOK)
{
    TiXmlHandle hDoc(&doc);
    TiXmlElement *pRoot, *pParm, *pParm2;
    pRoot = doc.FirstChildElement("a");
    if(pRoot)
    {
        pParm = pRoot->FirstChildElement("result");
        if (pParm)
        {
            if (pParm->GetText()=="0")
            {
                pParm2 = pRoot->NextSiblingElement("data");
                if (pParm2)
                {
                    sValue = pParm2->GetText();
                    std::cout << "sValue: " << sValue << std::endl;
                }
            }
        }
    }
}

我认为GetText() 是正确答案,但我做错了,因为我从来没有进入if 来检查&lt;data&gt; 元素。

谁能帮我解释一下?

【问题讨论】:

  • TinyXML 可以选择使用 std::string 而不是 char 缓冲区对其进行编译。您可能需要指定使用它的方式,因为它会影响字符串比较中的潜在错误。
  • 我的 PCH 中确实有 #define TIXML_USE_STL
  • 我所做的只是执行 make 并构建完成

标签: c++ xml parsing tinyxml


【解决方案1】:

因为在您的情况下,&lt;data&gt; 不是&lt;a&gt; 的兄弟。

您正在检查 pRoot->NextSiblingElement("data") 而您应该检查 pParm->NextSiblingElement("data");

你也可以改成

pParm2 = pRoot->FirstChildElement("data");

编辑: 抱歉,我以为你指的是这个,如果:

if (pParm2)

所以,解决方案可能是这样的:

if (std::string(pParm->GetText())=="0")

if (strcmp(pParm->GetText(), "0"))

你选择。我更喜欢第一个。

编辑 2:

真的很抱歉,我忘记了 strcmp 返回两个字符串相同的第一个位置,所以,在你的情况下应该是:

if (strcmp(pParm->GetText(), "0") == 0)

您还需要包含&lt;string.h&gt;

【讨论】:

  • 我明白了,但我没有进入 if (pParm-&gt;GetText()=="0") 所以我认为与 0 的比较有问题
  • @Jason 这就是我所指的错误。您可以构建 TinyXML 以使用标准库,并且 std::string 之类的东西成为GetText() 之类的东西的类型。它是一个单一的编译器标志。如果没有它,您必须为字符串比较之类的事情而努力(正如您刚刚发现的那样)。
猜你喜欢
  • 1970-01-01
  • 2012-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-25
相关资源
最近更新 更多