Unity 数据读取|(五)XML文件解析(XmlDocument,XmlTextReader)

简介: Unity 数据读取|(五)XML文件解析(XmlDocument,XmlTextReader)


1. 前言

XML,全称为可扩展标记语言(eXtensible Markup Language),是一种用于描述、传输和存储数据的语言。它被设计用来传输和存储数据,与 HTML 不同,XML 的主要目的不在于显示数据,而是强调数据的结构性。XML 使用类似 HTML 的标签表示数据的结构和其他信息。

2. 优缺点

  • XML的优点:
  • 易于人类阅读和编写:XML文档的格式清晰、易于理解,方便人们进行编辑和查看。
  • 跨平台性:XML使用Unicode编码,具有跨平台性,可以在不同的操作系统、编程语言和地区之间进行数据交换。
  • 可扩展性:XML可以自定义标签,适用于不同领域的扩展和定制,具有较强的灵活性。
  • 强大的查询和操作能力:XML文档的结构化特性使其可以方便地被计算机程序解析和查询,支持XPath等查询语言,方便进行数据操作。
  • XML的缺点:
  • 冗余数据:XML文档在描述数据时会产生大量的冗余数据,尤其是在数据量较大的情况下,会导致文件体积较大。
  • 性能问题:XML文档的解析和查询操作需要一定的时间和计算资源,在处理大量数据时可能会影响性能。
  • 安全性问题:XML文档可能包含恶意代码,如XSS攻击等,需要注意安全性问题。
  • 不适用于所有数据类型:XML不适用于存储所有类型的数据,例如二进制文件、大文本文件等不适合用XML存储。

3. 解析

  • 格式模板
<?xml version="1.0" encoding="UTF-8"?>  
<root>  
  <element1>内容1</element1>  
  <element2 attribute1="value1">内容2</element2>  
  <element3 attribute2="value2">  
    <subelement>子内容</subelement>  
  </element3>  
</root>

3.1 XmlDocument

3.1.1 优缺点

  • 优点:
  • 易于使用:XmlDocument提供了大量的方法和属性,可以方便地操作和查询XML文档。它提供了对整个XML文档的树形结构进行遍历和查询的能力,使用户可以轻松地获取XML文档中的节点、属性、文本等内容。
  • 内存占用较小:XmlDocument将整个XML文档加载到内存中,因此适用于处理较小的XML文件。由于整个XML文档被加载到内存中,用户可以快速地访问和查询XML文档中的任意节点,而不需要进行磁盘I/O操作。
  • 缺点:
  • 处理大型文件时可能会遇到性能问题:由于XmlDocument将整个XML文档加载到内存中,因此在处理大型XML文件时可能会遇到性能问题。大量的XML数据可能会导致内存溢出或性能下降。
  • 不适用于流式处理:XmlDocument适用于一次性解析整个XML文档,而不适用于流式处理。如果需要按需读取XML文档中的节点,XmlDocument可能不是最佳选择。

3.1.2 解析

  • 读取:
//1.读取XML文件
//XmlDocument xml = new XmlDocument();
//读取文本方式1-xml.LoadXml(传入xml文本字符串)
//读取文本方式2-xml.Load(传入路径)
//2.读取元素和属性
//获取单个节点 : XmlNode node = xml.SelectSingleNode(节点名)
//获取多个节点 : XmlNodeList nodeList = xml.SelectNodes(节点名)
//获取节点元素内容:node.InnerText
//获取节点元素属性:
//1.item.Attributes["属性名"].Value
//2.item.Attributes.GetNamedItem("属性名").Value
//通过迭代器遍历或者循环遍历XmlNodeList对象 可以获取到各单个元素节点
XmlDocument doc = new XmlDocument();  
doc.Load("example.xml");  
XmlNode root = doc.DocumentElement;  
XmlNode node = root.SelectSingleNode("//player");  
string name = node.Attributes["name"].Value;  
int age = int.Parse(node.Attributes["age"].Value);  
Debug.Log("Name: " + name);  
Debug.Log("Age: " + age);
  • 写入:
//关键类 XmlDocument 用于创建节点 存储文件
 //关键类 XmlDeclaration 用于添加版本信息
 //关键类 XmlElement 节点类
XmlDocument doc = new XmlDocument();  
XmlElement root = doc.CreateElement("game");  
XmlElement player = doc.CreateElement("player");  
player.SetAttribute("name", "John");  
player.SetAttribute("age", 25);  
root.AppendChild(player);  
doc.AppendChild(root);  
doc.Save("example.xml");

3.2 XmlTextReader和XmlTextWriter

XMLTextReader 这个类设计的目的就是从XML文件中快速的读取数据,而对系统资源(主要包括内存和处理器时间)不做很高的要求。

3.2.1 优缺点

  • 优点:
  • 适用于流式处理:XmlTextReader适用于按需读取XML文档中的节点,适用于流式处理大型XML文件。通过逐个读取XML文档中的节点,XmlTextReader可以避免一次性加载整个XML文件到内存中,从而减少内存占用和提高处理性能。
  • 性能较好:由于XmlTextReader采用了事件驱动的模型,因此可以更好地利用系统资源,提高处理性能。事件驱动模型使得XmlTextReader可以更加高效地处理大型XML文件,同时减少CPU和内存的使用。
  • 缺点:
  • 事件驱动模型需要更多代码:相比XmlDocument类,XmlTextReader需要更多的代码来实现对XML文档的解析和处理。使用XmlTextReader进行XML解析需要编写更多的代码来处理事件触发和节点读取。
  • 不易于处理属性值:XmlTextReader对于属性值的处理不如XmlDocument方便,需要更多的代码来实现。使用XmlTextReader读取属性值时,需要额外编写代码来获取节点的属性并处理它们。
  • 它是只读的,仅向前的,不能在文档中执行向后导航操作

3.2.2 解析

  • XmlTextReader读取:
static void XmlTextReaderTest()
        {
            XmlTextReader textReader = new XmlTextReader(filePath3);
            textReader.WhitespaceHandling = WhitespaceHandling.None;
            while (textReader.Read())
            {
                if (textReader.NodeType == XmlNodeType.Element)
                {
                  if (reader.Name == "player")  
                    {  
                       string name = reader.GetAttribute("name");  
                       int age = int.Parse(reader.GetAttribute("age"));  
                       Debug.Log("Name: " + name);  
                       Debug.Log("Age: " + age);  
                    }  
                }
                if (textReader.NodeType == XmlNodeType.Text)
                {
                }
                if (textReader.NodeType == XmlNodeType.EndElement)
                {
                }
            }
            //读取完毕后要记得关闭流,否则会占用文档,无法被其它线程打开
            textReader.Close();
        }
  • XmlTextWriter写入:
XmlTextWriter writer = new XmlTextWriter("example.xml", System.Text.Encoding.UTF8);  
writer.WriteStartElement("game");  
writer.WriteStartElement("player");  
writer.WriteAttributeString("name", "John");  
writer.WriteAttributeString("age", 25);  
writer.WriteEndElement(); // player  
writer.WriteEndElement(); // game   
writer.Close();
相关文章
|
存储 Java 文件存储
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— logback.xml 配置文件解析
本文解析了 `logback.xml` 配置文件的详细内容,包括日志输出格式、存储路径、控制台输出及日志级别等关键配置。通过定义 `LOG_PATTERN` 和 `FILE_PATH`,设置日志格式与存储路径;利用 `&lt;appender&gt;` 节点配置控制台和文件输出,支持日志滚动策略(如文件大小限制和保存时长);最后通过 `&lt;logger&gt;` 和 `&lt;root&gt;` 定义日志级别与输出方式。此配置适用于精细化管理日志输出,满足不同场景需求。
3279 1
|
9月前
|
XML 数据采集 API
用Lxml高效解析XML格式数据:以天气API为例
免费Python教程:实战解析中国天气网XML数据,详解Lxml库高效解析技巧、XPath用法、流式处理大文件及IP封禁应对策略,助你构建稳定数据采集系统。
442 0
|
XML JavaScript Android开发
【Android】网络技术知识总结之WebView,HttpURLConnection,OKHttp,XML的pull解析方式
本文总结了Android中几种常用的网络技术,包括WebView、HttpURLConnection、OKHttp和XML的Pull解析方式。每种技术都有其独特的特点和适用场景。理解并熟练运用这些技术,可以帮助开发者构建高效、可靠的网络应用程序。通过示例代码和详细解释,本文为开发者提供了实用的参考和指导。
629 15
|
JSON 监控 网络协议
Bilibili直播信息流:连接方法与数据解析
本文详细介绍了自行实现B站直播WebSocket连接的完整流程。解析了基于WebSocket的应用层协议结构,涵盖认证包构建、心跳机制维护及数据包解析步骤,为开发者定制直播数据监控提供了完整技术方案。
2546 9
|
缓存 监控 搜索推荐
【实战解析】smallredbook.item_get_video API:小红书视频数据获取与电商应用指南
本文介绍小红书官方API——`smallredbook.item_get_video`的功能与使用方法。该接口可获取笔记视频详情,包括无水印直链、封面图、时长、文本描述、标签及互动数据等,并支持电商场景分析。调用需提供`key`、`secret`和`num_iid`参数,返回字段涵盖视频链接、标题、标签及用户信息等。同时,文章提供了电商实战技巧,如竞品监控与个性化推荐,并列出合规注意事项及替代方案对比。最后解答了常见问题,如笔记ID获取与视频链接时效性等。
|
存储 缓存 监控
如何高效爬取天猫商品数据?官方API与非官方接口全解析
本文介绍两种天猫商品数据爬取方案:官方API和非官方接口。官方API合法合规,适合企业长期使用,需申请企业资质;非官方接口适合快速验证需求,但需应对反爬机制。详细内容涵盖开发步骤、Python实现示例、反爬策略、数据解析与存储、注意事项及扩展应用场景。推荐工具链包括Playwright、aiohttp、lxml等。如需进一步帮助,请联系作者。
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
942 140
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
1539 29
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
613 4
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

推荐镜像

更多
  • DNS