首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ TinyXML 解析庫完整指南:DOM 模型讀寫 XML 文件實戰

     編輯:關於C++

TinyXML 簡介

TinyXML 是輕量級開源 C++ XML 解析庫,支援 Windows/Linux,將 XML 文件解析為內存 DOM 樹,提供直觀 API 遍歷操作。核心類:

  • TiXmlDocument:文檔根節點
  • TiXmlElement:元素節點(可巢狀、含屬性)
  • TiXmlAttribute:屬性
  • TiXmlText:文本內容
  • TiXmlDeclaration:XML 聲明
  • TiXmlComment:註釋

工程集成步驟

  1. 下載源碼,將 6 個文件加入專案:tinystr.h/cpp, tinyxml.h/cpp, tinyxmlerror.cpp, tinyxmlparser.cpp。
  2. 代碼中僅需 #include "tinyxml.h";編譯時需編譯所有 .cpp。

寫入 XML 完整範例

LinkEndChild(decl);
    // 根元素
    TiXmlElement* root = new TiXmlElement("Info");
    root->SetAttribute("num", 3);
    doc->LinkEndChild(root);
    // 子元素循環
    for (int i = 0; i < 3; ++i) {
        TiXmlElement* stu = new TiXmlElement("Stu");
        stu->SetAttribute("class", i==2 ? "B" : "A");
        stu->SetAttribute("id", i+1);
        stu->SetAttribute("flag", (i+1)*10);
        root->LinkEndChild(stu);
        // 子節點:姓名、分數、城市
        auto addChild = [&](const char* name, const char* text) {
            TiXmlElement* e = new TiXmlElement(name);
            e->LinkEndChild(new TiXmlText(text));
            stu->LinkEndChild(e);
        };
        addChild("Name", "Mike");
        addChild("Score", "88");
        addChild("City", "Shenzhen");
    }
    doc->SaveFile("stu_info.xml");
    delete doc;
    return 1;
}

讀取 XML 完整範例

Value() << endl;
    for (TiXmlElement* stu = root->FirstChildElement(); stu; stu = stu->NextSiblingElement()) {
        cout << stu->Value() << " ";
        for (TiXmlAttribute* attr = stu->FirstAttribute(); attr; attr = attr->Next())
            cout << attr->Name() << "=" << attr->Value() << " ";
        cout << endl;
        for (TiXmlElement* child = stu->FirstChildElement(); child; child = child->NextSiblingElement())
            cout << "  " << child->Value() << ": " << child->FirstChild()->Value() << endl;
    }
    return 1;
}

生成 XML 效果


  
    Mike
    88
    Shenzhen
  
  ...
  ...

常見坑點

  • 編譯必須包含所有 .cpp,否則鏈接錯誤。
  • LinkEndChild 所有權轉移給父節點,不可重複掛載同一節點,也不可手動刪除已掛載節點。
  • 屬性值統一按字符串存取,數值需自行轉換。
  • 大文件建議使用 SAX 流式解析(TinyXML 不支援,需換庫如 RapidXML、pugixml)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved