xml文件读取

Tinyxml的官方网址:http://www.grinninglizard.com

官方介绍文档:http://www.grinninglizard.com/tinyxmldocs/tutorial0.html

在TinyXML中,根据XML的各种元素来定义了一些类:

TiXmlBase:整个TinyXML模型的基类。

TiXmlAttribute:对应于XML中的元素的属性。

TiXmlNode:对应于DOM结构中的节点。

TiXmlComment:对应于XML中的注释

TiXmlDeclaration:对应于XML中的申明部分,即<?versiong=“1.0” ?>。

TiXmlDocument:对应于XML的整个文档。

TiXmlElement:对应于XML的元素。

TiXmlText:对应于XML的文字部分

TiXmlUnknown:对应于XML的未知部分。

TiXmlHandler:定义了针对XML的一些操作。

根据下图来说明常用的类对应的文本格式:

复制代码

<?xml version="1.0" ?> //TiXmlDeclaration,声明

//TiXmlElement,元素
//TiXmlComment,注释
//TiXmlElement,元素
Welcome to MyApp
//是元素TiXmlElement ,“Welcome to MyApp”是TiXmlText,文本
Thank you for using MyApp//同上

//TiXmlElement,元素

// Window是元素TiXmlElement ,name、x、y、h是TiXmlAttribute



复制代码
 TinyXML是个解析库,主要由DOM模型类(TiXmlBase、TiXmlNode、TiXmlAttribute、TiXmlComment、TiXmlDeclaration、TiXmlElement、TiXmlText、TiXmlUnknown)和操作类(TiXmlHandler)构成。它由两个头文件(.h文件)和四个CPP文件(.cpp文件)构成,用的时候,只要将(tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp)导入工程就可以用它的东西了。如果需要,可以将它做成自己的DLL来调用。

注意,TiXmlBase 是TiXmlNode的基类,TiXmlNode是TiXmlElement、TiXmlComment、TiXmlText、TiXmlDeclaration、TiXmlUnknown、TiXmlDocument的基类。

  1.  TinyXML配置
    

在stdafx.h头文件中增加头文件引用#include “tinyxml/tinyxml.h”

在工程设置中加入lib引用库

在stdafx.h中加入动态库引用

#ifdef _DEBUG
#pragma comment(lib,“TinyXMLD.lib”)
#else
#pragma comment(lib,“TinyXML.lib”)
#endif
3. TinyXML读取和保存文件
3.1 读取xml文件
TiXmlDocument lconfigXML;
if( !lconfigXML.LoadFile( strXmlFile.c_str() ) )
{
break;
}
3.2 读取xml参数
复制代码
TiXmlDocument lActionXML;
lActionXML.Parse(strRmcpParam.c_str());
if(lActionXML.Error())
{
strErr = “输入参数不是标准的xml格式”;
return false;
}
复制代码
3.3 保存xml参数到文本
TiXmlDocument tyDoc;

tyDoc.SaveFile(m_strFilePath);
3.4 保存xml参数到临时变量
TiXmlDocument tyDoc;

TiXmlPrinter printer;
tyDoc.Accept(&printer);
std::string devParam = std::string(printer.CStr());
4. TinyXML增删改查
4.1 增
创建一个如1中的xml文件代码

复制代码
void write_app_settings_doc( )
{
TiXmlDocument doc;
TiXmlElement* msg;
TiXmlDeclaration* decl = new TiXmlDeclaration( “1.0”, “”, “” );
doc.LinkEndChild( decl );
TiXmlElement * root = new TiXmlElement( “MyApp” );
doc.LinkEndChild( root );
TiXmlComment * comment = new TiXmlComment();
comment->SetValue(" Settings for MyApp " );
root->LinkEndChild( comment );
TiXmlElement * msgs = new TiXmlElement( “Messages” );
root->LinkEndChild( msgs );
msg = new TiXmlElement( “Welcome” );
msg->LinkEndChild( new TiXmlText( “Welcome to MyApp” ));
msgs->LinkEndChild( msg );
msg = new TiXmlElement( “Farewell” );
msg->LinkEndChild( new TiXmlText( “Thank you for using MyApp” ));
msgs->LinkEndChild( msg );
TiXmlElement * windows = new TiXmlElement( “Windows” );
root->LinkEndChild( windows );
TiXmlElement * window;
window = new TiXmlElement( “Window” );
windows->LinkEndChild( window );
window->SetAttribute(“name”, “MainFrame”);
window->SetAttribute(“x”, 5);
window->SetAttribute(“y”, 15);
window->SetAttribute(“w”, 400);
window->SetAttribute(“h”, 250);
TiXmlElement * cxn = new TiXmlElement( “Connection” );
root->LinkEndChild( cxn );
cxn->SetAttribute(“ip”, “192.168.0.1”);
cxn->SetDoubleAttribute(“timeout”, 123.456); // floating point attrib
dump_to_stdout( &doc );
doc.SaveFile( “appsettings.xml” );
}
复制代码
在节点最后插入新节点

TiXmlNode* LinkEndChild( TiXmlNode* addThis );
在节点后 前/后 插入新节点

TiXmlNode* InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis );
TiXmlNode* InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis );
4.2 删
删除某个节点, TiXmlNode是TiXmlElement、TiXmlComment、TiXmlText、TiXmlDeclaration、TiXmlUnknown、TiXmlDocument的基类

TiXmlNode node;
node.Clear();
从A节点上移除子节点B

TiXmlNode nodeA;
nodeA. RemoveChild( TiXmlNode* removeThis );
从元素A上移除名字为B的属性

TiXmlAttribute attrA;
attrA. RemoveAttribute( const char * name );
4.3 改
查找内容为,现需要将1234改成其他值

TiXmlNode* lpnode = NULL;
lpnode = tixml.RootElement()->IterateChildren(“mfid”,lpnode);
TiXmlAttribute* tiattr = lpnode->ToElement()->FirstAttribute();
//找到mfid节点,获取第一个属性值。注意,如果有多个属性值,需要判断哪个属性值是需要的
tiattr->SetValue(mfid.c_str());
替换一个节点

TiXmlNode* ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis );
4.4 查
获取link节点

复制代码
const TiXmlNode* lpItemNode = NULL;//初始化
lpItemNode = lconfigXML.RootElement()->IterateChildren(“link”, lpItemNode);
if (lpItemNode == NULL)
{
//Can not find break;
}
复制代码
获取link节点中的type属性值

std::string strType = lpItemNode->ToElement()->Attribute(“type”);
遍历节点

复制代码
const TiXmlNode* lpMapNode = NULL; //初始化
lpMapNode = lconfigXML.RootElement()->IterateChildren(“node”, lpMapNode);
if (lpMapNode)
{
rms::CStationMapping litem;
const TiXmlNode* lpItemNode = NULL ;
while(lpItemNode = lpMapNode->IterateChildren(“item”,lpItemNode))
{
string str = lpItemNode->ToElement()->Attribute(“ABC”);
}
}
复制代码
遍历元素属性

TiXmlAttribute* pAttr = NULL;
for (pAttr = pNode->FirstAttribute(); pAttr; pAttr = pAttr->Next())
{
  …
}
节点的下一个兄弟节点

const TiXmlNode* NextSibling() const;
元素的下一个元素

const TiXmlElement* NextSiblingElement() const;
属性的下一个属性

const TiXmlAttribute* Next() const;
返回值为NULL表示不存在

  1.  一个完整例子
    

复制代码
void AppSettings::load(const char* pFilename)
{
TiXmlDocument doc(pFilename);
if (!doc.LoadFile()) return;

TiXmlHandle hDoc(&doc);
TiXmlElement* pElem;
TiXmlHandle hRoot(0);

// block: name
{
    pElem=hDoc.FirstChildElement().Element();
    // should always have a valid root but handle gracefully if it does
    if (!pElem) return;
    m_name=pElem->Value();

    // save this for later
    hRoot=TiXmlHandle(pElem);
}

// block: string table
{
    m_messages.clear(); // trash existing table

    pElem=hRoot.FirstChild( "Messages" ).FirstChild().Element();
    for( pElem; pElem; pElem=pElem->NextSiblingElement())
    {
        const char *pKey=pElem->Value();
        const char *pText=pElem->GetText();
        if (pKey && pText) 
        {
            m_messages[pKey]=pText;
        }
    }
}

// block: windows
{
    m_windows.clear(); // trash existing list

    TiXmlElement* pWindowNode=hRoot.FirstChild( "Windows" ).FirstChild().Element();
    for( pWindowNode; pWindowNode; pWindowNode=pWindowNode->NextSiblingElement())
    {
        WindowSettings w;
        const char *pName=pWindowNode->Attribute("name");
        if (pName) w.name=pName;
        
        pWindowNode->QueryIntAttribute("x", &w.x); // If this fails, original value is left as-is
        pWindowNode->QueryIntAttribute("y", &w.y);
        pWindowNode->QueryIntAttribute("w", &w.w);
        pWindowNode->QueryIntAttribute("hh", &w.h);

        m_windows.push_back(w);
    }
}

// block: connection
{
    pElem=hRoot.FirstChild("Connection").Element();
    if (pElem)
    {
        m_connection.ip=pElem->Attribute("ip");
        pElem->QueryDoubleAttribute("timeout",&m_connection.timeout);
    }
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值