tinyxml源碼
Ⅰ 求在VS或VC平台下可以編譯的開源軟體的源代碼,要一萬行左右的,最好為C或C++,拜託啦~
你看看CodePlex上面有沒有,或者CodeProject上面找找。
SourceForge上估計以開源編譯器通過的為主。
1.TinyXML
2.RapidXml
3.xerces
Ⅱ linux tinyxml2怎麼編譯
1.首先,要到官網上去把tinyxml庫下載下來,網址為:點擊打開鏈接:http://sourceforge.net/projects/tinyxml/
2.把下載的tinyxml庫解壓縮,我這里是解壓縮到/opt 目錄下
3.進入到解壓縮目錄下,我們會發現Tinyxml在Windows 下是使用微軟的VS 來生成的庫,因為其中有tinyxml.sln,tinyxml_lib.vcxproj,tinyxmlSTL.vcxproj等文件,當然,Tinyxml是開源的,所以它也有一個Makefile,用來生成Linux下的Tinyxml庫。整個Tinyxml源碼項目其實是由2個頭文件和一個4個C++源文件(.cpp)組成:tinystr.h,tinyxml.h,tinystr.cpp,tinyxml.cpp,tinyxmlerror.cpp,tinyxmlparser.cpp。其中還有一個xmltest.cpp文件,只是一個測試代碼,有興趣的話,大家可以打開研究它。好了,現在介紹怎麼修改它的Makefile:
(1)使用vim或者其他的編輯器打開Makefile文件
(2)將其中的注釋為Targets of the build的下一行OUTPUT := xmltest一行修改為:OUTPUT := libtinyxml.a
(3)將其中的注釋為Source files 的下一行SRCS:=tinyxml.cpp tinyxml-parser.cpp xmltest.cpp tinyxmlerror.cpp tinystr.cpp中的xmltest.cpp刪除,因為它只是一個測試源文件,不需要編譯。
(4)將其中的Output的下一行的${LD} -o $@ ${LDFLAGS} ${OBJS} ${LIBS} ${EXTRA_LIBS}修改為:${AR} $@ ${LDFLAGS} ${OBJS} ${LIBS} ${EXTRA_LIBS}。大致改成這樣
- ${OUTPUT}:${OBJS}
- ${AR}$@${LDFLAGS}${OBJS}${LIBS}${EXTRA_LIBS}
- #${LD}-o$@${LDFLAGS}${OBJS}${LIBS}${EXTRA_LIBS}
(5)將Makefile的倒數第二行 xmltest.o:tinyxml.h tinystr.h,注釋掉,因為不需要將演示程序添加到靜態庫中。然後保存退出。
(6)在終端下進入Makefile所在目錄,執行make命令編譯,即可在Makefile所在目錄下生成libtinyxml.a文件。
4.接下來就可以使用這個靜態庫了:$ g++ -o xmltest xmltest.cpp libtinyxml.a 注意:將使用的靜態庫放在源文件後面即可,如果靜態庫文件不在當前目錄,應該使用它的絕對路徑或者用g++的參數-L來指定路徑,因為編譯器默認在當前目錄下先查找指定的庫文件。
修改後的Makefile (v 1.0.1) 記錄如下:
[plain] view plain print?
#****************************************************************************
#
#MakefileforTinyXmltest.
#LeeThomason
#www.grinninglizard.com
#
#ThisisaGNUmake(gmake)makefile
#****************************************************************************
#,orNOotherwise
DEBUG:=NO
#,orNOotherwise
PROFILE:=NO
#TINYXML_USE_.NO,thenSTL
#willnotbeused.YESwillincludetheSTLfiles.
TINYXML_USE_STL:=NO
#****************************************************************************
CC:=gcc
CXX:=g++
LD:=g++
AR:=arrc
RANLIB:=ranlib
DEBUG_CFLAGS:=-Wall-Wno-format-g-DDEBUG
RELEASE_CFLAGS:=-Wall-Wno-unknown-pragmas-Wno-format-O3
LIBS:=
DEBUG_CXXFLAGS:=${DEBUG_CFLAGS}
RELEASE_CXXFLAGS:=${RELEASE_CFLAGS}
DEBUG_LDFLAGS:=-g
RELEASE_LDFLAGS:=
ifeq(YES,${DEBUG})
CFLAGS:=${DEBUG_CFLAGS}
CXXFLAGS:=${DEBUG_CXXFLAGS}
LDFLAGS:=${DEBUG_LDFLAGS}
else
CFLAGS:=${RELEASE_CFLAGS}
CXXFLAGS:=${RELEASE_CXXFLAGS}
LDFLAGS:=${RELEASE_LDFLAGS}
endif
ifeq(YES,${PROFILE})
CFLAGS:=${CFLAGS}-pg-O3
CXXFLAGS:=${CXXFLAGS}-pg-O3
LDFLAGS:=${LDFLAGS}-pg
endif
#****************************************************************************
#Preprocessordirectives
#****************************************************************************
ifeq(YES,${TINYXML_USE_STL})
DEFS:=-DTIXML_USE_STL
else
DEFS:=
endif
#****************************************************************************
#Includepaths
#****************************************************************************
#INCS:=-I/usr/include/g++-2-I/usr/local/include
INCS:=
#****************************************************************************
#
#****************************************************************************
CFLAGS:=${CFLAGS}${DEFS}
CXXFLAGS:=${CXXFLAGS}${DEFS}
#****************************************************************************
#Targetsofthebuild
#****************************************************************************
OUTPUT:=libtinyxml.a
all:${OUTPUT}
#****************************************************************************
#Sourcefiles
#****************************************************************************
SRCS:=tinyxml.cpptinyxmlparser.cpptinyxmlerror.cpptinystr.cpp
#Addonthesourcesforlibraries
SRCS:=${SRCS}
OBJS:=$(addsuffix.o,$(basename${SRCS}))
#****************************************************************************
#Output
#****************************************************************************
${OUTPUT}:${OBJS}
${AR}$@${LDFLAGS}${OBJS}${LIBS}${EXTRA_LIBS}
#${LD}-o$@${LDFLAGS}${OBJS}${LIBS}${EXTRA_LIBS}
#****************************************************************************
#commonrules
#****************************************************************************
#
%.o:%.cpp
${CXX}-c${CXXFLAGS}${INCS}$<-o$@
%.o:%.c
${CC}-c${CFLAGS}${INCS}$<-o$@
dist:
bashmakedistlinux
clean:
-rm-fcore${OBJS}${OUTPUT}
depend:
#makedepend${INCS}${SRCS}
tinyxml.o:tinyxml.htinystr.h
tinyxmlparser.o:tinyxml.htinystr.h
tinyxmlerror.o:tinyxml.htinystr.h
Ⅲ MFC中用Tinyxml處理xml文件並顯示內容
使用Tinyxml創建和讀取XML文件的優點:1,可在Windows和Linux中使用;2,方便易學,易用,可在http://sourceforge.net/projects/tinyxml/獲取源代碼。
將其中的文件tinystr.h,tinyxml.h,tinystr.cpp,tinyxmlerror.cpp,tinyxmlparser.cpp和tinyxml.cpp拷貝到您的工程目錄,即可方便使用。
Ⅳ 如何在CentOS上安裝並漢化Code:Blocks
安裝步驟
一、安裝wxWidgets
1.下載wxWidgets源碼包,地址:http://www.wxwidgets.org/downloads/
2.解壓。可以使用tar命令,CentOS里也可以直接用滑鼠右鍵操作
3.進入解壓後的目錄,打開終端,依次輸入以下命令
./configure (最好不要加上prefix參數,使用默認設置會比較有利於後面步驟的順利推進)
make (編譯。此過程相當漫長,可以打兩盤鬥地主再回來)
make install (安裝。)
安裝完成後,終端輸出如下提示:
The installation of wxWidgets is finished. On certain
platforms (e.g. Linux) you'll now have to run ldconfig
if you installed a shared library and also modify the
LD_LIBRARY_PATH (or equivalent) environment variable.
這是說需要設置環境變數LD_LIBRAY_PATH(環境變數的作用是告訴系統尋找wxWidgets開發庫該去的路徑。因為操作系統的邏輯是,如果在我認為該去的路徑沒找到的我要的東西的話,我就會認為那個東西木有安裝),暫不關閉本大步中打開的終端。
二、設定環境變數LD_LIBRAY_PATH
參考鏈接:
ldconfig及 LD_LIBRARY_PATH http://www.linuxidc.com/Linux/2011-10/45744.htm
Linux環境變數修改和設置 http://www.linuxidc.com/Linux/2012-12/75495.htm
Linux export 命令 http://www.linuxidc.com/Linux/2012-10/72746.htm
依據上一大步最後得到的提示信息,綜合參考資料,我們作出以下操作,
1.仍在第一大步打開的終端,不改變目錄,輸入以下命令:
ldconfig (這完全是根據第一步最後的提示信息來的)
export -p (查看系統當前環境變數的值,此步僅為了和設置後的效果作對比,可省略)
可以看到現在,LD_LIBRAY_PATH的值是空的(結果中沒有此項的存在)。
2.繼續輸入命令:
./wx-config --libs
得到結果(安裝目錄不同結果會有小差異):
-L/root/Desktop/wxWidgets-2.8.12/lib
-pthread -Wl,-rpath,/root/Desktop/wxWidgets-2.8.12/lib
-lwx_gtk2_richtext-2.8 -lwx_gtk2_aui-2.8 -lwx_gtk2_xrc-2.8
-lwx_gtk2_qa-2.8 -lwx_gtk2_html-2.8 -lwx_gtk2_adv-2.8 -lwx_gtk2_core-2.8
-lwx_base_xml-2.8 -lwx_base_net-2.8 -lwx_base-2.8
3.在/etc目錄下找到文件profile,打開它,在裡面添加以下命令:
export LD_LIBRARY_PATH="…………"
引號里的內容為上一小步「./wx-config --libs」的執行結果。export命令用於編輯環境變數,如果你不知道該加在什麼位置,請在文件中隨意另找一條export命令,跟在他後面即可。保存profile文件。
4.還是在前面打開的終端,繼續輸入命令:
source /etc/profile (在不用重啟系統的情況下使profile修改的內容生效)
export -p (查看系統當前環境變數的值)
這回可以看到,LD_LIBRAY_PATH的值被成功設定為第2小步里「./wx-config --libs」的執行結果。
三、安裝codeblocks
1.下載codeblocks源碼包,地址:http://www.codeblocks.org/downloads/
2.解壓。
3.進入解壓後的目錄,打開新的終端,依次輸入以下命令
./configure --prefix=/usr/local/codeblocks (prefix參數用以指定安裝路徑。如果跳過了第二大步,則在此會得到沒有安裝wxWidgets的提示)
make (編譯。額,咱們繼續鬥地主……)
make install (安裝。)
OK,至此,Code::Blocks安裝圓滿完成。在任意目錄下打開終端,直接執行codeblocks命令即可運行Code::Blocks。
四、codeblocks漢化
1.下載codeblocks的漢化包,地址:
免費下載地址在 http://linux.linuxidc.com/
用戶名與密碼都是www.linuxidc.com
具體下載目錄在 /2014年資料/2月/5日/Hadoop公平調度器指南 PDF
下載方法見 http://www.linuxidc.com/Linux/2013-07/87684.htm
2.在/usr/share/ 或者/usr/local/share/
目錄下(看你在第三大步中是怎麼指定的prefix參數)找到codeblocks目錄(內含icons、images、lexers、scripts等
資源目錄以及一些壓縮包),並在該目錄下建立一個子文件夾:locale(注意 locale
全為小寫字母)。如果找不到,請看步驟3,否則直接看步驟4。
3.在桌面上打開終端,運行命令:locate codeblocks >codeblocks 。運行完畢後,在桌面生成了一個名為codeblocks的文件,打開該文件,從中找到codeblocks目錄所在的路徑。
4.將所下載的壓縮包解壓到第2步創建的locale目錄下,則locale目錄下應出現zh_CN子目錄,內有一個名為codeblocks.mo的文件。
5.
啟動Code::Blocks,點擊主菜單的「Settings」,選擇「Enviornment」。出現的對話框中,左邊選中「View」,右邊打勾
「Internationalization (needs restart)」,並在後面的復合框中選中「Chinese
(Simplified)」。確認退出本對話框。
6.重啟Code::Blocks。再看到的應該是中文簡體界面了。
主要糾結的問題
1.最早下了一套rpm包,然後在安裝到第四個包,libtinyxml0,的時候出現了包依賴問題:
error: Failed dependencies:
libstdc++.so.6(GLIBCXX_3.4.9) is needed by libtinyxml0-2.6.1-9.1.2.i586
rpmlib(PayloadIsLzma) <= 4.4.6-1 is needed by libtinyxml0-2.6.1-9.1.2.i586
這個問題困擾了我很久,搜了很多文檔來看都木有解決,最後就放棄了。歡迎知道怎麼辦的請給我留言,謝謝!
據資源的上傳者說,在OpenSUSE Linux下測試通過。如果你也使用這個系統,可以去這個鏈接看看:http://www.linuxidc.com/Linux/2014-02/97367.htm
2.根據看到的資料,我在安裝完wxWidgets之後直接安裝codeblocks,結果終端報錯,
configure: error:
wxWidgets must be installed on your system
but the wx-config script couldn't be found.
Please check that wx-config is in path, the directory
where wxWidgets libraries are installed (returned by
'wx-config --libs' command) is in LD_LIBRARY_PATH or
equivalent variable and wxWidgets version is 2.8.0 or above.
但是我明明已經安好了wxwidgets啊!找了好多資料,試了好多方法,都木有解決。後來仔細閱讀了wxwidgets安裝成功後的提示信息,拿來和codeblocks安裝初始化的報錯信息比對,才終於找到了症結所在:環境變數設置。
基本我看到的所有資料都沒提這個問題,但他確實很重要。由此我得到的結論是,網上資料固然多,按部就班問題亦多。若要順順利利,還請多看系統提示。
順手牽羊
1./etc/ld.so.conf
這個文檔記錄了編譯時使用的動態鏈接庫的路徑。默認情況下,編譯器只會使用/lib和/usr/lib
這兩個目錄下的庫文檔,如果想往上面兩個目錄以外加東西的時候,就需要在etc/ld.so.conf.d目錄下添加一個conf文件,把新路徑加進去,
然後再調用ldconfig。
又有一些文獻說,如果想往上面兩個目錄以外加東西的時候,一定要修改/etc/ld.so.conf文件,不然會系統找不到新庫。看完後我茫然了,後來我打開了ld.so.conf文件,裡面內容如下:
include ld.so.conf.d/*.conf
看完,我突然就懂了。
2.wxWidgets與wxGTK
wxwidgets 是一個c++編寫的用來提供gui開發的框架。它包含一個可以支持現今幾乎所有操作系統的GUI庫。而適用於Linux系統的就是wxGTK,Windows平台下的則叫做wxMSW。
3.使用tar命令時,壓縮包不能有「(」等非法符號
Ⅳ C語言xml解析
把所有的數據當做一個字元串
收到數據後先strstr(buffer,"<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
如果返回的是NULL則表示沒有這段 退出
buffer是你收到的數據起始地址
Ⅵ vs2012 mfc 使用TinyXml的問題
預編譯頭的文件。在工程屬性中去掉預編譯頭這個選項。
Ⅶ 如何利用tinyxml操縱xml及注意問題
創建的格式如下:
復制代碼 代碼如下:
<Persons>
<Person>
<name>lhy</name>
<age>22</age>
</Person>
</Persons>
上篇博客中,我們也介紹了tinyxml解析器中的所有的類以及類之間的關系。
創建上述格式的xml,代碼如下:
復制代碼 代碼如下:
//創建一個XML的文檔對象。
TiXmlDocument *myDocument = new TiXmlDocument();
//創建一個根元素並連接。
TiXmlElement *RootElement = new TiXmlElement("Persons");
myDocument->LinkEndChild(RootElement);
//創建一個Person元素並連接。
TiXmlElement *PersonElement = new TiXmlElement("Person");
RootElement->LinkEndChild(PersonElement);
//創建name元素、age元素並連接。
TiXmlElement *NameElement = new TiXmlElement("name");
TiXmlElement *AgeElement = new TiXmlElement("age");
PersonElement->LinkEndChild(NameElement);
PersonElement->LinkEndChild(AgeElement);
//設置name元素和age元素的內容並連接。
TiXmlText *NameContent = new TiXmlText("lhy");
TiXmlText *AgeContent = new TiXmlText("22");
NameElement->LinkEndChild(NameContent);
AgeElement->LinkEndChild(AgeContent);
myDocument->SaveFile("d:\\lhy\\xml.txt");//保存到文件
只要搞清xml中節點之間的關系,創建不是問題。說白了就是一種輩分關系。
創建搞定了,但是作為C++程序猿,寫完之後,總感覺有點別扭,總感覺哪不對勁。你是否也看出其中存在的貓膩?
對了,些許的代碼中有大量的New指針。在C++中可沒有java中的垃圾回收機制,必須自己來處理這些廢棄的垃圾。但是代碼中卻沒有Delete語句?
上網查了資料,發現很多創建代碼中,都沒有Delete語句?難道是大家都是復制粘貼?還是tinyxml在搞怪?
我總結了以下幾點,但是最後在開發的過程中仍是疑問,但是開發的過程中,沒有出現問題,所以我的程序就暫時如此了。
說法一:很多文章中,都是new沒有delete,是因為tinyxml可以自動釋放,自動銷毀指針,無需開發者手動釋放。
質疑:new出來的可以自動釋放?new出來說明是在堆上創建的,什麼時候會自動釋放?程序結束時,自動釋放?那怎麼判斷程序結束呢?(在一個模塊中如何析構另一個模塊中的內存區域,我們後面會詳談),所以這種說法不攻自破。
既然tinyxml中有自毀功能,那我們查詢其源代碼,發現果真如此,tinyxml中在析構函數中,有相應的指針釋放。但是並不是每個節點如此的。
源碼中的詳情:
復制代碼 代碼如下:
TiXmlNode::~TiXmlNode()
{
TiXmlNode* node = firstChild;
TiXmlNode* temp = 0;
while ( node )
{
temp = node;
node = node->next;
delete temp;
}
}
void TiXmlNode::Clear()
{
TiXmlNode* node = firstChild;
TiXmlNode* temp = 0;
while ( node )
{
temp = node;
node = node->next;
delete temp;
}
firstChild = 0;
lastChild = 0;
}
我們也知道tinyxml中的類之間存在繼承關系。
那我們看tinyxml中的TixmlElement類:
復制代碼 代碼如下:
TiXmlElement::~TiXmlElement()
{
ClearThis();
}
void TiXmlElement::ClearThis()
{
Clear();
while( attributeSet.First() )
{
TiXmlAttribute* node = attributeSet.First();
attributeSet.Remove( node );
delete node;
}
}
因為TixmlElement是繼承TiXmlNode.但是在TiXmlDocument中並沒有發現TiXmlDocument類的析構函數。
第二種說法:TiXmlDocument對象就是這棵樹的根結點,
在一個完整的文檔中, 除了它, 其餘結點必須都是它的後代, 所以TinyXml用了一個很巧妙的方法來析構每一個結點所對應的對象 ----
每個結點的析構任務都委託給了它的父親, 這樣只要保證父親被正確析構, 或者調用了父親的Clear函數, 它的所有後代都會被正確的析構,
所以對整個文檔來說只要TiXmlDocument對象被正確析構即可。
在創建的上述代碼中,我們發現,所有的節點都是掛在根節點之下的。
其實這句代碼: myDocument->LinkEndChild(RootElement);使用了多態方式。類之間的關系如下:
並且LinkEndChild源代碼如下:它是父類TiXmlNode中的方法
復制代碼 代碼如下:
TiXmlNode* TiXmlNode::LinkEndChild( TiXmlNode* node )
{
assert( node->parent == 0 || node->parent == this );
assert( node->GetDocument() == 0 || node->GetDocument() == this->GetDocument() );
if ( node->Type() == TiXmlNode::DOCUMENT )
{
delete node;
if ( GetDocument() ) GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN );
return 0;
}
node->parent = this;
node->prev = lastChild;
node->next = 0;
if ( lastChild )
lastChild->next = node;
else
firstChild = node;// it was an empty list.
lastChild = node;
return node;
}
這樣的話:則只要刪除根節點,在程序中myDocument,就相當於把刪除了TiXmlNode,相當於調用了TiXmlNode的析構函數。
質疑:網上說這種方式,析構是從葉子到樹根。根據TiXmlNode中的析構函數,我們可以得出,是從樹根到葉子。
但是我們在Delete myDocument時,應該注意一點:
創建文檔時,也就是程序段中的myDocument。若是從堆上創建,則需需要手動釋放。如我們上述的片段中,就是在堆上創建的。
TiXmlDocument *myDocument=new TiXmlDocument ();
若是從棧上創建,則不須我們手動釋放,而是程序自動調用析構函數。同時我們應該注意,其他的元素必須在堆上創建。因為在TiXmlNode析構函數中,是delete的,但是棧上的東東是不須delete,所以除了根節點之外連接的後代節點是必須從堆上創建。
經過我們解釋,明白tinyxml中的原理了嗎?只要理解了tinyxml中的類的作用以及類之間的關系,看源碼是沒問題滴哦。
這篇博客根據創建xml小demo解釋了其中存在的疑問。那下篇博客中我們會根據解析xml來答疑解析中存在的問題。
Ⅷ vc++ 修改皮膚庫xml修改後怎麼生效
vc++ 修改皮膚庫xml修改後怎麼生效
建議你用tinyxml庫,網路一下這個庫,就有源碼和很多示例,挺不錯的開源庫