先弄個XML解析器代碼抄一抄 慢慢研究 O(∩_∩)O哈哈~



出處:http://bbs.csdn.net/topics/390229172

??????? 已經自我放逐好幾年了.打算去上班得了.在最后的自由日子里,做點有意義的事吧...

先來下載地址??? http://www.kuaipan.cn/file/id_12470514853353274.htm

????? 已經在很多正式,非正式的場合用過了.干脆開源得了.BSD授權.? 代碼比較久遠,最后一次修改也在4~5年前了.寫的比較BT,只有gcc/vc/icl能編譯...不過性能和易用性還是不錯的.之前我測試過的,只有幾個in?place的xml解析器稍微比我的快一點點.?? 下面是示例代碼:


// xml-test.cpp
#include <stdio.h>
#include "xml.h"// 自定義FILE*輸出策略
class cfile_writer {FILE *_fp;cfile_writer &operator = ( const cfile_writer& );cfile_writer( const cfile_writer& );
public:cfile_writer( FILE *fp ) : _fp(fp) {fputs( "-----------------\n", _fp );}~cfile_writer() {fputs( "\n", _fp );}// 策略不用預分配空間// 如果為1, 在輸出前會計算要占空間大小, 并調用resize接口進行預分配.static const int need_pre_allocate = 0;// 預分配接口bool resize( size_t size ) const { return true; }// 輸出一個字符void write( char value ) const  {fputc( value, _fp );}// 輸出一個字符串, 長度由size指定void write( const char *value, size_t size ) const  {fwrite( value, 1, size, _fp );}
};int main() {using namespace cpp::utils;const char xml_string[] = "<root attr=\"root attr\"><node prop=\"234\"/>text content<!-- comment --></root>";xml x;// 解析xml_string, 用不同的reader策略可以從不同的源中讀數據// 也可以自定義讀策略, 以適應不同的需求// 解析成功返回true.如果只有部分解析成功時雖然返回false,但已經解析成功的內容仍然可用// 如果宏XML_WITH_PARSE_STATUS設置為1(默認為0).可以從x.info()中得到解析器停止的位置,方便調試.但會降低解析器性能.x.parse( xml_reader( xml_string ) );xml x2;x2.push_back( xml::tag("root-x2") );	// 直接向空xml對象中添加標簽x2("root-x2").push_back( xml::text("text value") );x2.write( cfile_writer( stderr ) );// 輸出/root/node[prop]的值// ()運算符為標簽查找,返回指定名稱的第一個標簽.[]運算符為屬性查找,返回指定名稱的屬性.printf( "/root/node[prop] = [%s]\n", x("root")("node")["prop"].value().c_str() );// 這里使用了null object模式,所以無需檢查每一步的返回結果,不會因為訪問非法節點而產生異常.簡化使用printf( "null object test:[%s]\n", x("roxxot")("noeede")["prop"].value().c_str() );// 把root標簽轉成其迭代器(&運算符)xml::tag_iterator root_tag = &x("root");// 迭代所有子節點for( xml::node_iterator node = x.root()->begin(); node != x.root()->end(); ++node ) {// xml::node_iterator為通用節點迭代器, 可以指向任何類型的節點.// 并可以轉型成任意的其它迭代器. 但如果指向的節點類型和目標迭代器類型不符, 則會自動指向下一個合法的節點// 比如: <abc/><!--comment-->//       這里有兩個節點,一個abc標簽,一個注釋.//       如果有當前node迭代器指向abc標簽.//			把node轉成xml::tag_iterator類型時,則指向的節點不變.//			如果轉成xml::comment_iterator時則會指向后面的注釋.//			如果轉成其它不存在類型的節點,則會指向容器的末尾.printf( "node type: %d\t", node->type );switch( node->type ) {case xml::_TYPE_TAG:printf( "tag name:%s\n", xml::tag_iterator(node)->name().c_str() );break;case xml::_TYPE_COMMENT:printf( "comment:%s\n", xml::comment_iterator(node)->text().c_str() );break;case xml::_TYPE_TEXT:printf( "text:%s\n", xml::text_iterator(node)->text().c_str() );break;case xml::_TYPE_ATTRIBUTE:printf( "attribute:%s=%s\n", xml::attribute_iterator(node)->name().c_str(), xml::attribute_iterator(node)->value().c_str() );break;default:printf( "unknown type\n" );break;}};// 迭代所有子標簽for( xml::tag_iterator tag = x.root()->begin(); tag != x.root()->end(); ++tag ) {// 專用類型的迭代器只能遍歷此類型的節點printf( "tag:%s\n", tag->name().c_str() );}// 在/root/node下添加abc標簽, 并保存指向標簽的迭代器xml::tag_iterator abc_tag = x("root")("node").push_back( xml::tag( "abc" ) );// 用abc_tag迭代器向abc標簽添加屬性abc_tag->push_back( xml::attribute( "tag-prop", "value abcdefg" ) );// 在abc標簽前插入注釋abc_tag->parent().insert( abc_tag, xml::comment( "tag-prop comment" ) );// 把xml_string解析出來,并將結果放到abc_tag所指向的標簽里abc_tag->parse( xml_reader( xml_string ) );// 深拷貝x2對象中的根節點到abc標簽中,實現跨xml對象進行節點復制abc_tag->push_front_copy( x2.root() );// 輸出abc_tag指向的標簽, 第二個參數true表示只輸出內容標簽的內容,不包含標簽本身及屬性abc_tag->write( cfile_writer( stdout ), true );// 刪除第一個子節點abc_tag->erase( abc_tag->begin() );abc_tag->write( cfile_writer( stdout ), true );// 不能直接刪除孫節點x.erase( xml::tag_iterator(abc_tag->begin()) );	// 轉型成xml::tag_iterator是因為abc的第一個節點是屬性.刪除不直觀.用標記會明顯點abc_tag->write( cfile_writer( stdout ) );	// 沒有刪掉// 遞歸刪除可以成功x.recursion_erase( xml::tag_iterator(abc_tag->begin()) );abc_tag->write( cfile_writer( stdout ) );	// 已經刪除成功return 0;
}


只支持基本語法,很多東西不支持.比如:CDATA不支持,自定義轉意也不支持...
用來做配置文件還是不錯.


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/254704.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/254704.shtml
英文地址,請注明出處:http://en.pswp.cn/news/254704.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

紫書 例題8-10 UVa 714 (二分答案)

這道題讓最大值最小&#xff0c; 顯然是二分答案當題目求的是最大值最小&#xff0c; 最小值最大&#xff0c; 這個時候就要想到二分答案為什么可以二分答案呢&#xff0c; 因為這個時候解是單調性的&#xff0c; 如果簡單粗暴一點就全部枚舉一遍&#xff0c; 驗證答案。但是因…

was not declared in this scope

“was not declared in this scope”是一個錯誤信息&#xff0c;在編譯的時候會遇到。其含義為標識符在其出現的地方是未被定義的。 出現該錯誤的時候&#xff0c;會同時把未定義的變量名顯示出來。比如如下程序&#xff1a; int main(){ printf("%d",i);//這個i是…

函數參數的傳遞問題(一級指針和二級指針)

函數參數的傳遞問題&#xff08;一級指針和二級指針&#xff09; [轉]原以為自己對指針掌握了&#xff0c;卻還是對這個問題不太明白。請教&#xff01; 程序1&#xff1a; void myMalloc(char *s) //我想在函數中分配內存,再返回 { s(char *) malloc(100); } void …

Win7下使用U盤安裝linux Ubuntu16.04雙系統圖文教程

Win7下使用U盤安裝linux Ubuntu16.04雙系統圖文教程 Ubuntu&#xff08;友幫拓、優般圖、烏班圖&#xff09;是一個以桌面應用為主的開源GNU/Linux操作系統&#xff0c;Ubuntu 是基于DebianGNU/Linux&#xff0c;支持x86、amd64&#xff08;即x64&#xff09;和ppc架構&#xf…

SynchronizationContext

SendOrPostCallback xxx vg > { Text "內部&#xff1a; "vg.ToString(); };dynamic vx new { a SynchronizationContext.Current, b xxx };Thread td new Thread(x >{dynamic tmp x;// SynchronizationContext ds x as SynchronizationContext;for (in…

CoDeSys的前世今生

&#xfeff;&#xfeff;工作以及網上看到不少人說&#xff0c;CoDeSys和西門子step7&#xff0c;在德國都屬于標準過程&#xff0c;牛逼的小朋友都可以用其編程&#xff0c;不知真假&#xff0c;相信無風不起浪&#xff0c;多少有些依據&#xff0c;看看國內清一色的日系編程…

UVALive 7324 ASCII Addition (模擬)

ASCII Addition題目鏈接&#xff1a; http://acm.hust.edu.cn/vjudge/contest/127407#problem/A Description Nowadays, there are smartphone applications that instantly translate text and even solve math problems if you just point your phone’s camera at them. You…

Eclipse中執行Ant腳本出現Could not find the main class的問題及解

試過了&#xff1a;https://blog.csdn.net/bookroader/article/details/2300337 但是不管用&#xff0c;偶然看到這篇沒有直接關系的 https://blog.csdn.net/jiuyueguang/article/details/9350753 聯想了一下。項目是JDK1.5&#xff0c;Eclipse是JDK1.8啟動&#xff0c;所以在R…

獲得變量的名稱獲得傳入參數的參數類型與堆棧中的函數名獲得變量的名稱

獲得變量的名稱 獲得變量的名稱函數 public static string GetVarName(Expression<Func<變量類型, 變量類型>> exp) public static string GetVarName_Int(Expression<Func<int, int>> exp){return ((MemberExpression)exp.Body).Member.Name;}使用時…

視頻通話研究002

還是關于視頻質量。經測試&#xff0c;在公網server使用SQCIF(128x98)進行視頻通話。2個client都是這個設置&#xff0c;感覺不出馬賽克&#xff0c;模糊嚴重&#xff0c;在一個手機client抓包&#xff0c;例如以下&#xff1a; 第1,2行是client發到server的數據&#xff1b;第…

實力打臉: 量子隱形傳輸與 “瞬間移動” 毫無關系

有兩個團隊已經在量子隱形傳輸研究領域創造了新的傳輸記錄&#xff1a;利用深不可測的量子力學知識將一個粒子的量子態迅速從一個位置遷移到另一個位置的粒子上。其中一個團隊采用這種方法&#xff0c;運用一種光學纖維將一個光子的量子態穿越加拿大西南部的一個城市&#xff0…

Android初級教程:使用xml序列器

之前備份短信的時候生成xml都是手動拼寫的&#xff0c;有一個問題&#xff1a;當短信里面存在</body>這樣的標簽的時候&#xff0c;最后結果就不是完整的xml文件&#xff0c;顯然出錯。但是&#xff0c;今天使用序列化器的方式&#xff0c;就能有效的解決上邊遇到的問題。…

架構師之我見

架構師之我見 2009-08-06 架構師是一個項目組的靈魂人物&#xff0c;他決定著整個系統的技術選型、整體架構以及模塊劃分&#xff0c;同時還可能擔當與領導層的溝通角色&#xff0c;從某種意義上來說&#xff0c;架構師在很大程度上決定著項目的成敗與否&#xff0c;正所謂火車…

KUKA 聲明變量時的幾點注意

臨時變量&#xff1a; 1、src文件中定義的局部變量&#xff0c;該種變量存在于內存中的棧上。子程序調用時&#xff0c;變量在棧上動態生成。調用結束后從棧中自動銷毀。 因為存在于棧上的原因&#xff0c;訪問該變量需要棧指針&#xff0c;所以該種變量無法在機器人程序運行時…

三個點擬合圓形的函數C#

三個點擬合圓形的函數 函數說明 public void FitCircleFromThreePoints(double 點1X, double 點1Y, double 點2X, double 點2Y, double 點3X, double 點3Y, out double 圓心X坐標, out double 圓心Y坐標, out double 圓形半徑大小)public void FitCircleFromThreePoints(doub…

poj3264Balanced Lineup(倍增ST表)

Balanced LineupTime Limit: 5000MS Memory Limit: 65536KTotal Submissions: 52328 Accepted: 24551Case Time Limit: 2000MSDescription For the daily milking, Farmer Johns N cows (1 ≤ N ≤ 50,000) always line up in the same order. One day Farmer John decides to …

LightOJ1283 Shelving Books(DP)

題目 Source http://www.lightoj.com/volume_showproblem.php?problem1283 Description You are a librarian. You keep the books in a well organized form such that it becomes simpler for you to find a book and even they look better in the shelves. One day you ge…

量子傳輸技術轉移一個人需要4500萬億年

看過《星際迷航》的朋友一定不會忘記這句經典的臺詞&#xff1a;斯科蒂&#xff0c;將我傳輸過去&#xff01;其中涉及到量子隱形傳輸的技術&#xff0c;可以把物體從三維時空一處傳輸到另一處。但可惜的是&#xff0c;這種看著非常炫的技術或許根本無法實現。 到目前為止&…

使用OutputDebugString幫助調試

使用OutputDebugString幫助調試 前面我已經介紹了使用TRACE來幫助我們調試&#xff0c;但使用TRACE有一個限制&#xff0c;只能在將程序DEBUG編譯狀態下才能使用&#xff0c;下面我們介紹OutputDebugString函數&#xff0c;通過它&#xff0c;可以在在DEBUG或RELEASE情況也可以…

leetcode-551-Student Attendance Record I(判斷是否出現連續幾個相同字符)

題目描述&#xff1a; You are given a string representing an attendance record for a student. The record only contains the following three characters: A : Absent.L : Late.P : Present.A student could be rewarded if his attendance record doesnt contain more t…