2013-10-11 31 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,它似乎崩潰了,但我不知道我是如何濫用它。 –