tinyxml解析xml文件

时间:2014-12-17 21:57:58

标签: c++ xml tinyxml

我有一个像这样的xml文件:

<?xml version="1.0"?>

<ApplicationSettings>
    <BeamGeometry  
        Dimension="2"
        Type="fan"
        Shape="arc"
        LengthFocalPointToISOCenter="558"
        LengthISOCenterToDetector="394"
        LengthDetectorSeperation="0.98"
        LengthModuleSeperation="0.04"
        NumberModules="57" 
        NumberDetectorsPerModule="16" 
        NumberISOCenterShift="3.25" />
</ApplicationSettings>

我想使用tinyxml根据条目名称(例如(LengthFocalPointToISOCenter))检索所有值(例如558)。这是我的代码,但尚未成功。

int SetFanbeamGeometry(const char* filename)    
{   
    int ret = TRUE;

    TiXmlDocument doc("E:\\Projects\\iterativeRecon\\ProjectPackage\\ApplicationSettings\\ApplicationSettings.xml");

    int LengthFocalPointToISOCenter;

    if( doc.LoadFile())
    {

        TiXmlHandle hDoc(&doc);
        TiXmlElement *pRoot, *pParm;
        pRoot = doc.FirstChildElement("ApplicationSettings");
        if(pRoot)
        {
            pParm = pRoot->FirstChildElement("BeamGeometry");
            int i = 0; // for sorting the entries
            while(pParm)
            {
                pParm = pParm->NextSiblingElement("BeamGeometry");
                i++;
            }
        }
    }
    else
    {
        printf("Warning: ApplicationSettings is not loaded!");
        ret = FALSE;
    }

    return ret;
}

我想知道如何使用tinyxml来做到这一点?对不起,我是第一次使用。它看起来让我很困惑。感谢。

1 个答案:

答案 0 :(得分:1)

您展示的代码段中只有一个BeamGeometry子元素;您尝试访问的信息是属性 - 它们不是单个元素。

所以你需要这样的东西:

// ...
pParm = pRoot->FirstChildElement("BeamGeometry");
if (pParm)
{
    const char* pAttr = pParm->Attribute("LengthFocalPointToISOCenter");
    if (pAttr)
    {
        int iLengthFocalPointToISOCenter = strtoul(pAttr, NULL, 10);
        // do something with the value
    }
}

如果你想遍历所有属性,那很简单:

const TiXmlAttribute* pAttr = pParm->FirstAttribute();
while (pAttr)
{
    const char* name = pAttr->Name(); // attribute name
    const char* value = pAttr->Value(); // attribute value
    // do something
    pAttr = pAttr->Next();
}