2014-10-05 101 views
-1

當TinyXml的或rapidXML解析我有當「<」字被放入XML文件這樣的錯誤:TinyXml的或rapidXML崩潰

Process returned -1073741819 (0xC0000005) execution time : 2.335 s 
Press any key to continue. 

你知道如何避免這種情況?

#include <iostream> 
#include "tinyxml2.h" 

using namespace std; 

int main() 
{ 
    tinyxml2::XMLDocument doc; 
    doc.LoadFile("my.xml"); 

    tinyxml2::XMLElement* element; 
    tinyxml2::XMLNode* node; 

    node = doc.FirstChildElement("root") -> FirstChildElement("sample"); 

    while (node != NULL) 
    { 
     cout << "--START--" << endl; 
     element = node -> FirstChildElement("field0"); 

     while(element != NULL) 
     { 
      const char* title = element -> GetText(); 

      if (title != NULL) 
       cout << ":: " << title << endl; 
      else 
       cout << ":: NULL" << endl; 

      element = element -> NextSiblingElement(); 

     } 

     cout << "---END---" << endl << endl; 

     node = node -> NextSibling(); 

    } 

    return 0; 

} 

my.xml文件是類似的東西 - 採取<crash>標記一下或放<crash>只有<字符,而不是 - 它導致反正崩潰:

<root> 
<sample> 
    <field0><crash>1</field0> 
    <field1>2</field1> 
    <field2>3</field2> 
    <field3>4</field3> 
    <field4>5</field4> 
    <field5>6</field5> 
    <field6>7</field6> 
    <field7>8</field7> 
</sample> 
</root> 

GDB輸出:

 
Program received signal SIGSEGV, Segmentation fault. 
0x0000000000402c5e in tinyxml2::XMLNode::FirstChildElement(char const*) const() 
(gdb) where 
#0 0x0000000000402c5e in tinyxml2::XMLNode::FirstChildElement(char const*) const() 
#1 0x00000000004013f7 in tinyxml2::XMLNode::FirstChildElement(char const*)() 
#2 0x00000000004in main() 

我想補充一點,我已經與rapidXML庫相同。

+0

''沒有終止符。 – 2014-10-05 15:04:53

+0

儘管不應該導致崩潰。 – 2014-10-05 15:05:22

+0

你有沒有嘗試在像gdb這樣的調試器下運行它? – 2014-10-05 15:07:15

回答

1

的問題是你的,不是他們: -

node = doc.FirstChildElement("root") -> FirstChildElement("sample"); 

如果帶有無效的XML文件,doc.FirstChildElement("root")是可能返回NULL。然後您將其解除引用...

這兩種解析器都不能以這種方式'部分地'解析無效的XML。試試這個。

node = doc.FirstChildElement("root"); 
if (node == NULL) 
    throw something; 
else 
    node = node -> FirstChildElement("sample"); 
0

的選項有:

  1. 調試TinyXML的,找出爲什麼它的崩潰,並修復它(如果你的源代碼),
  2. 查找XML驗證庫和驗證XML是有效的在嘗試解析它之前,或者
  3. 查找或寫入不會崩潰的XML解析器。
+0

積分2和3 - 似乎是最好的解決方案 – neutrino 2014-10-05 16:19:27

+0

第二個建議是最好的選擇。編寫穩定,可移植且無bug的解析器並非易事。如果不是爲了學習目的,重新發明輪子應該是最後的選擇。 – 2014-10-05 21:50:36