2014-12-17 2 views
0

У меня есть 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 извлечения всех значений (например, 558), на основе имени входа, такие как (LengthFocalPointToISOCenter). Вот мой код, но пока не удался.

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

В приведенном фрагменте есть только один дочерний элемент 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(); 
} 
+0

Спасибо. Но если я хочу просмотреть все записи? – Ono

+0

@Ono: Добавил это к ответу. –

+0

Удивительный! Благодаря! – Ono

Смежные вопросы