2012-06-20 252 views
0

我最近開始使用tinyXML。問題是當我運行我的程序通過xml讀取時,它返回一個訪問衝突。公共線是:TinyXML引發訪問衝突

doc.FirstChildElement("Map")->FirstChildElement("Width")->GetText() 

與Visual Studio調試器,我確定它的「地圖」返回null,然後用一個空引用調用函數。

這裏的第一行代碼,以及XML

XMLDocument doc; 
    doc.LoadFile(path.c_str()); 

    int width = atoi(doc.FirstChildElement("Map")->FirstChildElement("Width")->GetText()); 

XML:

<?xml version="1.0"?> 
<Master> 
<Map> 
    <Width>5</Width> 
    <Height>5</Height> 
    <Layers>1</Layers> 
    <Tiles> 
     <Tile> 
      <Id>1</Id> 
      <Path>data/tiles/dirt-base.png</Path> 
     </Tile> 
    </Tiles> 
    <Data> 
     <DataLayer>1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1</DataLayer> 
    </Data> 
</Map> 
</Master> 

重要的是要注意的,我原本沒有根標籤,倒是它的時候它沒有工作,但補充它仍然沒有幫助。任何幫助,將不勝感激

+0

'doc.LoadFile(...)'返回什麼? –

+0

切勿使用函數返回的指針而不檢查它們是否返回非空指針。 –

+0

有'路徑'嗎? – acraig5075

回答

0

在我看來,像一個你調用的TinyXML函數返回一個無效的指針。嘗試分別檢查每個呼叫的結果,然後您就可以確定問題。

3

變化

int width = atoi(doc.FirstChildElement("Map")->FirstChildElement("Width")->GetText()); 

int width = atoi(doc.FirstChildElement("Master")->FirstChildElement("Map")->FirstChildElement("Width")->GetText()); 

它的工作在我的電腦使用最新的TinyXML的。

根據TinyXml的文檔

您應首先檢查的LoadFile返回

if (!_doc.LoadFile(filename)) 
{ 
    printf("load file=[%s] failed\n", filename); 
    return -1; 
} 

然後檢查元素存在,以避免訪問衝突。

使用TiXmlHandle檢查元素更容易。

TiXmlHandle docHandle(&doc); 
TiXmlElement* child = docHandle.FirstChild("Map").FirstChild("Width").ToElement(); 
if (child) 
{ 
    // do something useful 
1

就像你在你的問題的評論說,錯誤代碼3 file not found 你已經超過可能整理了這一點,但是這方面的一個常見原因是僅僅讓反斜槓路徑錯誤的方式周圍。

我自己就有這個確切的問題。在完成了一些網頁開發之後,由於不同的腳本/標記/服務器端/客戶端funk正在進行(以及您有時需要反轉方向的位置),因此在相同項目中斜槓處於不同方向的環境在發佈時你的斜線會減半)!仍然讓我難倒了一個小時。

爲了參考的緣故,暫時擱置這個可能的解決方案 - 這是谷歌在TinyXML和這個問題上最顯着的結果。