Benjamin

静以修身,俭以养德,非澹薄无以明志,非宁静无以致远。
随笔 - 397, 文章 - 0, 评论 - 196, 引用 - 0
数据加载中……

lua中如何使用tinyxml

tinyxml是C++的XML解析器,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。
DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。

下面这两个文件就是对tinyxml库中常用的接口在lua的注册封装,使用的是常规的lua注册方法
lua_xml.h
lua_xml.cp
示例(lua文件):
function testxml()
xml = tinyxml();
filename = "./data/logiclist.xml";
if not xml:LoadFile(filename) then
print("open ", filename, " failed!");
return;
end
firstelename = "logicinfo";
element = xml:FirstChildElement(firstelename);
if not element then
print("not find element, element:", firstelename);
return;
end
print("servergroupid:", element:QueryString("servergroupid"));
firstelename = "logicserver";
otel = element:FirstChildElement(firstelename);
while otel do
print("ip:", otel:QueryString("ip"), "port:", otel:QueryInt("port"));
otel = otel:NextSiblingElement(firstelename);
end
return true;
end
下面的两个文件是使用lua_tinker对tinyxml库的封装
lua_class.h
lua_class.cpp
注册代码:
注意的是lua_tinker直接不支持c++重载,lua的底层是c,在c里面可以用函数指针实现多态,在lua中使用c++的类的成员,要用:,而不是.。
示例:
local function LoadLevelBase(filename)
xml = tinyxml();
if not xml:LoadFile(filename) then
print("open "..filename.." failed!");
end
local rootElement=xml:RootElement();
local element = rootElement:FirstChildElement("element");
local att_Name;
local att_Value;
--遍历xml
while element do
local ChildElement=element:FirstChild();
local ele={};
local attri={};
local event={};
--子节点
while ChildElement do
ele_Name=ChildElement:Value();
if ele_Name=='Event' then
attr = ChildElement:FirstAttribute();
while attr do
att_Name  = attr:Name();
att_Value = attr:Value();
attr = attr:Next();
end
else
ele_Value=ChildElement:GetText();
if ele_Name ~= 'Name' then
ele_Value=tonumber(ele_Value);
end
ele[ele_Name]=ele_Value;
--读取元素
-print(ele_Name..'='..ele_Value);
end
ChildElement=ChildElement:NextSibling();
end
end
end



posted on 2014-08-13 22:52 Benjamin 阅读(1727) 评论(0)  编辑 收藏 引用 所属分类: C/C++


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理