2013-10-11 5 views
1

моих знаний XML достаточно, чтобы пройти.Как слепо разглядеть в TinyXML

Что я хочу сделать - это слепо разобрать XML-строку и получить все элементы и атрибуты, начиная с корня. Я не могу использовать рекурсию, как пример в документации, и я не могу понять, как это сделать с помощью цикла. Я знаю достаточно, чтобы получить корень из строки XML и выполнить цикл через строку, но, похоже, не может получить атрибуты или текстовые значения.

Я не знаю никаких имен любых тегов и вам нужно их выяснить, когда я разбираю. Кто-нибудь знает, как я начинаю или пример?

Благодаря

Вот код, который я до сих пор для строки XML, как это, не работает, если его вложенные элементы, как местоположение и страны:

string strData = "<MyStuff mystring1=""111"" mystring2=""223"">\ 
         <MYTAG1>0</MYTAG1>\ 
         <MYTAG2>0</MYTAG3>\ 
         <MYTAG4>0</MYTAG4>\ 
         <location><country>GreatBritain</country></location>\ 
         </MyStuff>"; 

void parseXmlString2(TiXmlNode* root) 
{ 
TiXmlNode*   child; 
TiXmlElement*  elem = (TiXmlElement*)root; 
TiXmlAttribute* pAttrib = elem->FirstAttribute(); 

//This gets the root and its attributes. 
while(pAttrib) 
{ 
    cout << "Value: " << pAttrib->Name() << ":" << pAttrib->Value() << endl; 
    pAttrib=pAttrib->Next(); 
} 

//Now I want to parse up the rest. 
//Does not work if nested such as <location><country>GreatBritain</country></location> 
for(child = root->FirstChild(); child; child = child->NextSibling()) 
{ 

    //Test For child. 
    if(child->FirstChild()) 
    { 
     //My helper fuct to tell type 
     //getType(child->FirstChild()->Type()); 
     TiXmlNode*   myChild; 
     for(myChild = child->FirstChild(); myChild; myChild = child->IterateChildren(child->FirstChild())) 
     { 
      cout << " " << myChild->Value() << endl; 

     } 

    } 
} 

}

ответ

1

В конечном счете это работало для меня, спасибо всем за вход:

for(child = root->FirstChild(); child; child = child->NextSibling()) 
{ 

    if(child->Type() == TiXmlNode::TINYXML_ELEMENT) 
    { 

     thevalue = child->Value(); 
    } 

    //If this Node has children traverse them. 
    //and keep going for all. 
    if(child->FirstChild()) 
    { 
     TiXmlNode* myChild = child->FirstChild(); 
     while(myChild) 
     { 


      if(myChild->Type() == TiXmlNode::TINYXML_ELEMENT) 
      { 

       thevalue = child->Value(); 
      } 

      if(myChild->Type() == TiXmlNode::TINYXML_TEXT) 
      { 

       thevalue= myChild->Value(); 
      } 
      myChild = myChild->FirstChild(); 
     } 
    } 
} 
0

Я не» Я знаю, правильно ли я прав. Но если вы уже достигли цикличности через XMLElements вашего документа без рекурсии, тогда цикл через XMLAttributes должен быть простым.

Скажет у вас есть ваши XMLElement* elem вы хотите получить атрибуты из просто сделать

XMLAttribute* attrib; 
for(attrib = elem->FirstAttribute(); attrib != NULL; attrib = attrib->Next()) { 
    // do something 
    std::cout << attrib->Name() << " " << attrib->Value(); 
} 

Просто, чтобы увидеть, если TinyXML2 все делает правильно, я написал следующую примитивную рекурсивную функцию, которая печатает все элементы и их атрибуты (без значений):

void printAllChildren(XMLElement* parent, int recursionlvl) { 
    std::stringstream indent(""); 
    for(int i = 0; i <= recursionlvl; i++) { 
     indent << " "; 
    } 

    std::cout << "Element Name: " << indent.str() << parent->Name() << " "; 
    const XMLAttribute* attrib; 
    for(attrib = parent->FirstAttribute(); attrib != NULL; attrib = attrib->Next()) { 
     std::cout << attrib->Name() << " "; 
    } 
    std::cout << std::endl; 

    XMLElement* childEl; 
    for(childEl = parent->FirstChildElement(); childEl != NULL; childEl = childEl->NextSiblingElement()) { 
     printAllChildren(childEl, recursionlvl + 1); 
    } 
} 

Надеюсь, что это поможет. Приветствия.

РЕДАКТИРОВАТЬ: Без применения фактического выхода трудно догадаться, где ошибка. Но не должно быть

for(myChild = child->FirstChild(); myChild; myChild = child->IterateChildren(child)) 

в вашей самой внутренней петле? (См a TinyXML Reference)

+0

Спасибо, я постараюсь это, я не на машине я работал для этого, но я думал, когда я это пробовал, он рассматривал все как узел и пропускал текст и атрибуты. –

+0

Нет, это дает мне тот же результат, что я хочу сделать, проанализировать XML-строку, не зная, что в ней, и перечислить все узлы, атрибуты, текст. Я не уверен, могу ли я сделать это с помощью одного цикла или вложенных циклов? –

+0

Я могу видеть, как перебирать почти все, моя проблема пытается использовать IterateChildren, кажется, что он разбился, но я не уверен, как я злоупотребляю им. –