解析XML文件

Android向本地写入一个XML文件和解析XML文件 在网络存储过程中有很多时候会遇到XML文件解析和使用XML保存一些信息,解析XML文件用的比较多的方法是pull解析和SAX解析,但是我一般只用pull解析,下面就向cd卡写入一个XML文件,然后再使用pull解析的方法对文件进行解析。 阅读详情

动机

网游服务器端开发过程中,很多控制游戏的参数都不应该直接硬编码的。需要各种各样的配置和脚本文件,好处:
  1. 可以由策划或数值去随意修改,而不用动程序代码
  2. 配置可以动态加载,可以动态改变服务器运行中的参数,对已经发布的功能进行调整
一般,可采用:
  1. ini配置,一般用于window下的软件,游戏客户端有时会用到。比较简单,功能有限。
  2. Excel表格,数值策划特别喜欢用这个,可以做很多运算,生成数值,可以用VBA做更多的事情。
  3. xml配置,对于层次比较深、结构比较复杂的数据,应该算最佳选择了。
XML(eXtensible Markup Language)是一种标记语言,用于说明数据是什么,以及携带数据信息。主要用于:
  1. 丰富文件(Rich Documents):自定文件描述并使其更丰富
  2. 元数据(Metadata):描述其它文件
  3. 配置文件(Configuration Files):设定应用程序的参数
下面主要介绍一下对于xml文件作为服务器配置时候的解析方案。

问题

解析下面的XML文件:
<config>
     <node1 prop1="100" prop2="i am string", prop3="2012-01-02 23:00:00"/>
 
     <node2 id="1" prop1="100" prop2="string1"/>
     <node2 id="2" prop1="100" prop2="string1"/>
     <node2 id="3" prop1="100" prop2="string1"/>
     <node2 id="4" prop1="100" prop2="string1"/>
 
     <node3 prop1="100"  prop2="string1"/>
     <node3 prop1="100"  prop2="string1"/>
     <node3 prop1="100"  prop2="string1"/>
     <node3 prop1="100"  prop2="string1"/>
</config>


  • node1 - 整个xml文件里面只有一个该节点
  • node2 - 有多个并且id属性可以作为它的键值,称之为节点map
  • node3 - 有多个名为node3的节点,但没有键值,称之为节点vector

一般的解决方案

使用XMLPaser(用libxml2封装的一个解析器)来解析(TinyXML也类似,DOM方式的都大同小异):
XMLPaser xml;
if (xml.initFile("xxx.xml"))
{
     xmlNodePtr root = xml.getRootNode("config");
     if (root)
     {
          // 解析node1的prop1和prop2属性
           struct NodeConfig{
                    int prop1;
                    string prop2;
               } config;

          xmlNodePtr node1 = root->getChildNode(root, "node1");
          if (node1)
          {
              
               node1->getNodePropNum(node1, "prop1", &config.prop1, sizeof(config.prop1));
               node2->getNodePropStr(node1, "prop2", config.prop2);
          }

          // 解析node2节点map
           struct NodeConfig{
                    int prop1;
                    string prop2;
           };
          std::map nodemap;

          xmlNodePtr node2 = root->getChildNode(root, "node2");
          while (node2)
          {
               int id;
               NodeConfig config;
               
               node2->getNodePropNum(node2, "id", &id, sizeof(id));
               node2->getNodePropNum(node2, "prop1", &config.prop1, sizeof(config.prop1));
               node2->getNodePropStr(node2, "prop2", config.prop2);

               nodemap[id] = config;               

               node2 = node2->getNextNode(node2, "node2");
          }

          // 解析node3节点vector
          .....
     }
}


坏味道分析

上面的代码,有几点不足之处,列举如下:
  1. 代码重复
    • 整个解析过程大同小异,一步一步遍历加载在内存中的节点树
    • 节点或节点属性的名称、节点的层次结构不同的时候,就得写不同的代码,一般会采用复制代码的方式
  2. 使用不便
    • 往往要写一个单件管理器,在服务器启动的时候加载该配置,然后在管理器里面把需要的数据结构都定义好
    • 使用的时候,引用管理器里面的成员变量,代码既丑陋又容易出错
  3. 不安全
    • 节点名称、属性名称都是字符串,拼错了,运行时会发生逻辑错误

更好的解决方案

C++的结构与XML的对应树状结构对应起来,也就是数据绑定方案(Xml Data Binding)。自己曾经实现过一个Xml Data Binding库,名为xml_parser。具体用法如下:step1: 编写一份描述XML结构的配置文件(也是一份XML文件,xml_parser.xml)

step1: 编写一份描述XML结构的配置文件(也是一份XML文件,xml_parser.xml)
<config>
     <node1 prop1="int" prop2="string", prop3="t_Date"/>
     <node2 id="int" prop1="int" prop2="string" container_="map" key_="id"/>
     <node3 prop1="int"  prop2="string" container_="vector" />
</config>

step2: 生成binding类
xmlpg -f xml_paser.xml -o xml_parser.h

step3: 应用程序中使用
xml_config xml;
          if (xml.load("xxx.xml"))
          {
               // node1的prop1和prop2属性
               int prop1 = xml.node1.prop1();
               string prop2 = xml.node1.prop2();
               t_Date date  = xml.node1.prop3();

               // node2节点map
               for (xml_paser::Node2MapIter it = xml.node2.begin(); it != xml.node2.end(); ++ it)
               {
                    int id = it->first;
                    int prop1 = it->second.prop1();
                    string prop2 = it->second.prop2();
               }

               // node3节点vector
               for (size_t i = 0; i < xml.node3.size(); i ++)
               {
                    int prop1 = xml.node3[i].prop1();
                    string prop2 = xml.node3[i].prop2();
               }
          }


更多解决方案

方式特征开源库
DOM(Document Object Model)
  • 文档对象模型,整个文档就是一个根节点及其子节点构成
  • 树状,有子节点、父节点、兄弟节点
  • 访问效率较低
  • libxml2
  • Xerces-C++
  • TinyXML
  • SlimXML
  • RapidXML
SAX(Simple API for XML)
  • 基于事件解析XML
  • libxml2
  • Xerces-C++
Data Binding
  • C++的结构与XML的对应树状结构对应起来,使用起来比较容易
  • 安全,C++的结构为静态的,不会因为写错节点或节点属性名称拼写错误而导致逻辑错误
  • 代码简洁、清晰
  • 访问效率高,对所为节点或节点属性的访问只是函数调用,而不像DOM方式去循环遍历整个子树的节点,做一系列字符串比较操作
  • 不足之处,结构必须已知,DOM方式则不论程序里面对应的结构,先把整个节点树加载到内存中,程序根据自己的需要去读取自己想要的节点或节点属性
  • CodeSynthesis XSD

XML与Excel表格做配置的比较

比较XMLExcel表格
结构树状的层次结构MxN的二维数组
适用性
  • 信息具有层次性
  • 结构复杂
  • 有一个键值可以索引的关联数组结构
  • 结构简单
  • 配置操作比较简单
不足之处
  • 配置起来不是那么方便,每个节点名、属性名都必须指定
  • 添加新列的时候,不一定所有行都用到该列属性,容易导致空间的浪费
 2012/04/25 21:15 于上海
PHP解析XML文件 一、什么是 XML? XML(Extensible Markup Language)即可扩展标记语言,它与HTML一样,都是SGML(Standard Generalized Markup Language,标准通用标记语言)。Xml是Internet环境中跨平台的,依赖于 阅读详情

相关推荐

游戏配置文件.xml

直接复制到罗技脚本开发窗口,小键盘灯是开关,进入游戏后直接可以使用,压枪只能说压得住,不能集中到一个点上面

Java游戏服务器开发之二十--xml配置文件

Java游戏服务器开发之二十--xml配置文件     游戏中使用的配置文件很多     像游戏中的关卡,英雄等级,装备之类都是使用配置文件(xml等)     比如有一个装备,配置表中有一条记录,数据库只需要存储这条记录的id,具体使用的时候,只需要从xml中获取这条记录就好了。     这些配置表一般都是前后端一致的。          现在我们服务器要做的就是解析xml,在项目启动的时候把这...

cmqwan的博客 8656

XML接球小游戏

含css、js、images的完整游戏(含有报告)

为什么使用xml,有什么好处

xml中所有标签都是类似html中的语义化标签,只是进行描述传达信息,xml本身不会做任何事情。计算机系统和数据库系统存储数据的形式多种,xml提供一种统一的格式,减少数据交换的复杂性。

qq_65535252的博客 388

生成xml文件

生成xml文件

保姆级教程:用NILMTK和REDD数据集,5分钟跑通你的第一个负荷分解模型

本文提供了一份详细的NILMTK和REDD数据集负荷分解模型教程,适合零基础用户快速上手。从环境准备、数据获取到模型构建和评估,全程仅需5分钟即可完成。特别适合希望快速入门非侵入式负荷分解(NILM)的开发者,涵盖数据预处理、模型训练及结果可视化等关键步骤。

weixin_30493401的博客 442

封装游戏配表读取和存储(xml格式);支持行列存取,标题存取

做服务器肯定会涉及到游戏配表,而读取游戏配表是一个必备技能; 之前一直都是采用TinyXml直接读,匹配字符串,每次加个表都是一大坨代码,看着也是心累; 因此利用了闲暇的时间封装了一个 xml配置表 读取类; 1.支持 按照 列*行的读取方法 2.支持 按照 "标题"*行的读取方法 3.支持 按照 列*行的修改 4.支持 按照 "标题"*行的修改 //例子用的xml , 库用的是 t...

weixin_33881140的博客 246

浮点数精度陷阱全解析:从IEEE 754到深度学习部署选型

在计算机数值计算中,浮点数是表示带小数数字的标准方式,但它的存储规则决定了精度和边界天生存在限制。许多开发者都曾遭遇过0.1+0.2不等于0.3的尴尬,或是模型训练中loss变成NaN的困扰,这些问题的根源往往指向IEEE 754标准中的规格化、非规格化表示及舍入规则。理解浮点数的底层原理,不仅能避开直接的比较判断陷阱,还能指导我们在不同场景下做出合理的技术选型。从C语言的printf到Python的repr,从嵌入式串口打印到深度学习中的FP32、FP16、BF16、TF32格式,浮点数知识贯穿底层开发和

weixin_34314962的博客 463

xml做为配置文件的好处与缺点

1.XML格式是W3C的标准,各种平台通用,可移植性好。而Windows下的注册表文件,基本上是黑盒,也不可能被移植到非Windows环境下。 2.XML提供了一种树形层次结构,可以很方便的定位某一功能块。而INI文件不提供这种便利。 3.从写的角度看,几乎所有的应用程序都能处理XML文件,并且通过DOM提供的方法可以很快捷的对XML文件进行操作,而Reg只能用特定的软件进行读取操作,而INI

startwithdp的专栏 1785

基于Java+Maven+Testng+RestAssured+Allure+Jenkins搭建一个接口自动化框架

2、有一个提取表达式列,通过编写每个接口的JSON提取表达式,后边在解析Excel时,对接口执行后的响应数据用该表达式提取出来,保存到环境变量,如果某些接口需要前置接口的响应数据,我们就可以从环境变量中获取该数据出来,从而解决了接口关联的问题。1、在之前介绍过全局配置类Contants中添加一个控制台日志开关控制权限,如果选择为false,则控制台不输出日志,将日志输出到allure报表,选择为true,则在控制台输出日志,不输出到allure报表。

专注于技术分享的博主 1185

从零到一:R与RStudio的安装与配置全攻略

本文提供了R与RStudio的完整安装与配置指南,涵盖Windows、Mac和Linux三大操作系统。从基础环境搭建到高级性能优化,详细介绍了R语言安装、RStudio配置、项目管理和实用技巧,帮助数据科学初学者快速搭建高效的分析工作环境。

weixin_29062671的博客 420

XML 的用途介绍

这使得 XML 在不损失数据的情况下,更容易扩展或升级到新的操作系统、新应用程序或新的浏览器。未来也许会出现某种字处理软件、电子表格程序以及数据库,它们可以使用纯文本格式读取彼此的数据,而不需要使用任何的转换程序。通过 XML,您的数据可供各种阅读设备使用(手持的计算机、语音设备、新闻阅读器等),还可以供盲人或其他残障人士使用。不同的应用程序都能够访问您的数据,不仅仅在 HTML 页中,也可以从 XML 数据源中进行访问。由于 XML 独立于硬件、软件以及应用程序,XML 使您的数据更可用,也更有用。

hdxx2022的博客 259

单片机欠压保护、欠压复位的用法及作用

一. 前言 使用编程环境 :KEIL mdk4 单片机 : NRF24LE1   二. 分析 查询各开发芯片的数据手册,一般在电源管理或者复位设置章节中。以下NRF24LE1为例: Power supply supervisor(电源监控): 电源主管在开机时对系统进行初始化,对即将发生的情况提供预警当电源电压过低而不能安全运行时,系统处于复位状态。 电源管理框图如下:   ...

城南花已开的博客 8401

C++解析XML文件

C++读取XML文件

StarWang的博客 1万+

On the convergence of FedAvg on non-iid data

On the convergence of FedAvg on non-iid data

Lyn_S的博客 7082

GEE去云处理代码段解读(位运算)

GEE去云处理代码段解读,包含位运算符号解读、bitwiseAnd()函数、eq()函数解读

jiekeheiguanglan的博客 2068

Android解析XML文件

按计划每周更新一篇技术博文,第一篇:《Android解析XML文件》 一、在Android应用中的XML文件来源 1、本地xml文件     本地XML文件可以放在应用根目录assets文件夹、res/xml、res/raw、SDcard卡、应用的data目录等; 除res/xml可直接通过getXml(int id)获取XML文档,返回一个解析器对象(XmlResourcePar

钟秀 4万+

PCL RANSAC拟合空间圆【2026最新版】

RANSAC三维点云空间3D圆拟合。博客长期更新,本文最新更新时间为:2026年4月13日。代码在PCL1.15.0中测试通过

点云侠的博客 7455

xml文件全面解析。

示例(xml元素和属性定义): 6.读取xml。 7.xml建模

m0_64719055的博客 1万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

XPATH解析xml文件

XPATH解析xml文件一、什么是XPATH访问路径有查找本地xml文件2.解析网上xml文件 一、什么是XPATH 是一门在 XML 文档中查找信息的语言。XPath 用于在 XML 文档中通过元素和属性进行导航。 访问路径有 路径表达式: 1. / : 从根节点开始查找 2. // : 重发起查找的的节点位置查找后节点 (使用最多) 3. . : 查找当前节点 4. .. : 选择属性 5. @ : 属性使用方法: [@ 属性名='值'] [@ 属性名>'值'

D_AKJS 2812

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Unity解析XML文件

因为有些老项目还是用了XML来存取数据和存放相应的游戏配置。所以XML的读取还是需要重温一下。 XML文件相比于JSON而言,稍微复杂一点。而且现在基本上都倾向于用JSON,更加的轻量级。 Unity内置的API是支持解析XML的。 我们通过下面的一个例子来重温一下,Unity环境下XML的读取。 下面这个是我们要读取的XML的文件,该文件我们放在了UnityAsset目录下的Resour...

胡同的博客 2515

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Java - XML文件解析

使用java编写以DOM方式解析某目录下的特定XML文件,有源码

weixin_44462773的博客 2005

Qt中解析XML文件

是 Qt 提供的一个用于读取 XML 文件的快速、高效的流式解析器。它采用"拉模式"(pull parser)解析方式,允许应用程序控制解析过程,按需读取XML内容。可以将一个符合格式的 XML 字符串或文件解析(“加载”)到内存中,并构建成一棵节点树(DOM 树)。它作为整个 XML 文档树的入口点和容器,承载了文档的所有内容,包括元素、属性、注释、处理指令等。,是 DOM 树中最重要的节点类型,用于构建 XML 文档的骨架结构。等,它既可以包含文本内容,也可以包含属性,还可以包含其他子元素。

weixin_45144862的博客 1339

超大xml文件解析

对于普通大小xml的解析,现在有许多的插件能很好的支持,比如dom4j,JDOM等,由于已经做过一层封装。因此,用起来也很方便。 当然对于这样的xml解析没有什么问题,也不必花费笔墨去探讨了。 前两天遇到一个300多M的超大xml解析,基本用什么编辑器打开,什么编辑器就崩溃的。 如果用类似dom4j等解析方式,在解析之前需要把文件先加载到内存  File xmlFile = new Fil...

灰色轨迹 2098

xml文件的解析

分为两种解析方式: 方式一:sax方式解析 优点:逐行读取和解析,所以速度很快。 缺点:只能解析,不能往xml文件中写数据。 我们需要构建自己的xml解析类。这个类实现 抽象类 SaxDelegator,然后实现里面的3个纯虚函数。 —————————————————————————————————— yjh.xml文件内容:      河南大学   创思科技

清新的世界 1670

快速有效的解析大型XML文件

和老师做研究也快一年了。使我认识比较深的是对XML的解析和图论。由于我们做的试验是通过XML来生成图,于是摆在我们面前的首要问题是如何解析XML。              在此之前曾经用过DOM4J来解析过XML,那是在给研究生的学姐作业Webservice的时候用的,用来解析

JDream314的专栏 1万+
上一篇: 代码的坏味道
下一篇: 每周一荐:文本处理工具AWK
future_fighter
博客等级 码龄20年 129粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值