2012-12-19 113 views
0

我有以下格式無法訪問使用pugixml

<Objects> 
    <Object> 
     <Id>1</Id> 
     <Name>Head</Name> 
    </object> 
    <Object> 
     <Id>2</Id> 
     <Name>Right Hand</Name> 
    </object> 
    <Object> 
     <Id>3</Id> 
     <Name>Left Hand</Name> 
    </object> 
    <Object> 
     <Id>4</Id> 
     <Name>Right hand</Name> 
    </object> 
    <Object> 
     <Id>5</Id> 
     <Name>Cup</Name> 
    </object> 
    <Object> 
     <Id>6</Id> 
     <Name>Book</Name> 
    </object> 
</Objects> 

一個XML文件,我想用一個循環由物體通過以下方式來訪問我的文件對象使用循環XML節點:

xml_node nodeObjects = doc.child("Objects").child("Object"); 

    for(xml_node_iterator it = nodeObjects.begin(); it != nodeObjects.end(); ++it) 
    { 
     cout<<"Name = "<<it->child_value("Name")<<endl; 
    } 

也:

xml_node nodeObjects = doc.child("Objects"); 
for(xml_node nodeObject = nodeObjects.first_child(); nodeObject; nodeObject = nodeObject.next_sibling()) 
    { 
     numOfObjects += 1; 
     const char *id = nodeObject.child_value("Id"); 
     const char *name = nodeObject.child_value("Name"); 

     //cout<<"ID = "<<id<<" Name = "<<name<<endl; 
     //cout<<nodeObjects.next_sibling("Object").child_value("Id")<<endl;; 

    } 

最後:

xml_node nodeObjects = doc.child("Objects"); 
for(xml_node nodeObjects: nodeObjects.children("Object")) 
    { 
    } 

儘管前兩種方法沒有打印預期結果(只有第一次迭代有效),但編譯器說第三種方法是語法錯誤!

任何幫助!

回答

2
  1. 您的XML文件格式錯誤 - 結束標記名稱應與開始標記匹配,比較區分大小寫。請記住,通過檢查xml_document :: load_file返回值來始終檢查文檔是否成功加載。就像現在一樣,解析可能會失敗,您會得到一個空文檔(或者說文檔的一部分,直到第一個錯誤,即第一個對象)。

  2. 第一個循環遍歷nodeObjects的子節點;爲了使其工作,nodeObjects應該引用對象標記,而不是其第一個對象子標記。

  3. 第二個和第三個循環看起來不錯 - 第三個循環使用C++ 11功能,因此在編譯器上不支持它。

+0

感謝您的回答。它正在工作。 – Ibrahim

+0

@Ibrahim如果zeuxcg的答案是正確的,請將其標記爲給他信用。如果你一直給予答案的信貸,人們將更有可能回答你未來的問題。 –