Unity3d C# 在WebGL平台加载并解析xml文件实现总结

前言

xml是可扩展标记语言,由一系列的元素、属性、值节点等构成的一个树形结构,除了可读性差一点,别的用于存储一些结构化的数据还是比较方便的。这个功能在Unity3d端的实现是比较方便快捷的:

void GetXML1() {string filePath = Application.streamingAssetsPath + "/xml1.xml";if (File.Exists(filePath)){XmlDocument xmlDoc = new XmlDocument();xmlDoc.Load(filePath); XmlNodeList nodes = xmlDoc.SelectSingleNode("rootitem").ChildNodes;foreach (XmlNode node in nodes){Debug.Log(node.Name + ":" + node.InnerText);}}elseDebug.LogError("xml文件1不存在:" + filePath);}

如上的代码,将xml文件放到StreamingAssets文件夹下,使用XmlDocument.Load函数直接加载,让后通过XmlNodeList可以快速的解析。
xml文件的内容如下:

<?xml version="1.0" encoding="utf-8"?><!--以下为正式内容-->
<rootitem><labone>老铁666</labone><!--这是xml1的文件-->
</rootitem>

在Unity3d端或者pc端都能正确的解析输出:
在这里插入图片描述

WebGL问题

同样如上的代码放到WebGL平台就无法正常使用,虽然在Unity出包WebGL的时候没有任何的异常,但是运行起来就无法正常加载:
在这里插入图片描述

可以看到xml文件找不到这个log是我自己的判断if (File.Exists(filePath))为false导致的。

直接打开文件

而且我直接访问地址是可以在浏览器中打开xml文件的localhost/TestWebGLBuilds/StreamingAssets/xml1.xml:
在这里插入图片描述

直接加载

那么如果放弃文件是否存在判断直接XmlDocument.Load函数来加载呢:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(filePath); 
XmlNodeList nodes = xmlDoc.SelectSingleNode("rootitem").ChildNodes;
foreach (XmlNode node in nodes)
{Debug.Log(node.Name + ":" + node.InnerText);
}

这样也无法加载,报错如下:
在这里插入图片描述

修改路径

尝试修改filePath的值如下:

string filePath = "/StreamingAssets/xml1.xml";

直接加载XmlDocument.Load:
在这里插入图片描述

string filePath = "StreamingAssets/xml1.xml";

文件路径判定File.Exists:
在这里插入图片描述

上面的修改也是无效的。

正确加载解析

经过一段时间的尝试和测试,终于找到了一个在Windows端和WebGL端都能正常加载解析的方法:

   void GetXML2(){StartCoroutine(GetRequest(Application.streamingAssetsPath + "/xml2.xml"));}IEnumerator GetRequest(string uri){using (UnityWebRequest webRequest = UnityWebRequest.Get(uri)){yield return webRequest.SendWebRequest();if (webRequest.error == null){Debug.Log("xml文件2:" + webRequest.downloadHandler.text); XmlDocument xmlDoc = new XmlDocument();xmlDoc.LoadXml(webRequest.downloadHandler.text);XmlNodeList nodes = xmlDoc.SelectSingleNode("rootitem").ChildNodes;foreach (XmlNode node in nodes){Debug.Log(node.Name + ":" + node.InnerText);  }}else{Debug.LogError("xml文件2异常:" + webRequest.error);}}}

新建一个xml2.xml的文件:

<?xml version="1.0" encoding="utf-8"?><!--以下为正式内容-->
<rootitem><labtwo>老铁没毛病666</labtwo><!--这是xml2的文件-->
</rootitem>

可以看到WebGL端也能正常加载解析:
在这里插入图片描述

这个实现方式是通过UnityWebRequest来加载xml文件内容,XmlDocument.LoadXml()来加载解析内容。

总结

之前的实现方式具体问题可能是路径问题或者Load函数平台不支持。这两种可能性都有,不过目前都没有验证。因为使用错误路径(如:“/StreamingAssets/xml1.xml”)时,使用XmlDocument.Load来加载会提示路径错误;而使用Application.streamingAssetsPath时,也不是提示路径错误,而是报错:
Invoking error handler due to Uncaught abort(43) at Error
at jsStackTrace (TestWebGLBuilds.wasm.framework.unityweb:8:15602)
因为我也没在Unity文档中找到具体的支持信息 。
所以具体是路径问题?还是库支持问题?目前还没法确定。
不过要兼容WebGL平台的可用方式就是加载使用UnityWebRequest.Get,解析使用XmlDocument.LoadXml()。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/451258.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Docker进阶】镜像制作-用Dockerfile制作镜像(一)

进阶一 docker镜像制作 文章目录 进阶一 docker镜像制作用dockerfile制作镜像dockerfile是什么dockerfile格式为什么需要dockerfileDockerfile指令集合FROMMAINTAINERLABELCOPYENVWORKDIR 用dockerfile制作镜像 用快照制作镜像的缺陷&#xff1a; 黑盒不可重复臃肿 docker…

Python 轻量级定时任务调度:APScheduler

简述 APscheduler (Advanced Python Scheduler)&#xff0c;作用为按指定的时间规则执行指定的作业。提供了基于日期date、固定时间间隔interval 、以及类似于Linux上的定时任务crontab类型的定时任务。该框架不仅可以添加、删除定时任务&#xff0c;还可以将任务存储到数据库…

ES6中新增Array.of()函数的用法详解

new Array()方法 ES6为Array增加了of函数用一种明确的含义将一个或多个值转换成数组。因为用new Array()构造数组的时候&#xff0c;是有二意性的。 构造时&#xff0c;传一个参数&#xff0c;实际上是指定数组的长度&#xff0c;表示生成多大的数组。 构造时&#xff0c;传…

问题:媒体查询语法中, 可用设备名参数表示“文档打印或预览“的是 #媒体#媒体#其他

问题&#xff1a;媒体查询语法中, 可用设备名参数表示"文档打印或预览"的是 A、C.?screen B.?projection C、A.?print D.?speech 参考答案如图所示

【JavaEE】UDP协议与TCP协议

作者主页&#xff1a;paper jie_博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文于《JavaEE》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精力)打造&…

【大厂AI课学习笔记】1.4 算法的进步(4)关于李飞飞团队的ImageNet

第一个图像数据库是ImageNet&#xff0c;由斯坦福大学的计算机科学家李飞飞推出。ImageNet是一个大型的可视化数据库&#xff0c;旨在推动计算机视觉领域的研究。这个数据库包含了数以百万计的手工标记的图像&#xff0c;涵盖了数千个不同的类别。 基于ImageNet数据库&#xf…

如何构建多种系统架构支持的 Docker 镜像

如何构建多种系统架构支持的 Docker 镜像 1.概述2.解决方案3.使用manifest案例 1.概述 我们知道使用镜像创建一个容器&#xff0c;该镜像必须与 Docker 宿主机系统架构一致&#xff0c;例如 Linux x86_64 架构的系统中只能使用 Linux x86_64 的镜像创建容器 例如我们在 Linux…

从3天到3小时,“文思助手”让行业专业写作“文思泉涌”

AI 长文写作能否结合用户所在行业规范与需求&#xff0c;定制化体现专业内容&#xff1f;“文思助手”提供了解决方案。基于大语言模型强大理解和生成能力&#xff0c;通过用户自建知识库、个性化语境调整&#xff0c;能够智能地创作出符合专业要求的个性化长文。 厦门苏哒智能…

移动Web——less

1、less-简介 less是一个CSS预处理器&#xff0c;Less文件后缀是.less。扩充了CSS语言&#xff0c;使CSS具备一定的逻辑性、计算能力注意&#xff1a;浏览器不识别Less代码&#xff0c;目前阶段&#xff0c;网页要引入对应的CSS文件VS code插件&#xff1a;Easy LESS&#xff…

Canal 结合 SpringBoot 源码梳理

1、canal是什么&#xff0c;可以用来作什么 canal是阿里开源的一个用于监听数据库binlog&#xff0c;从而实现数据同步的工具。 2、安装 我使用的是1.1.5版本&#xff0c;太高的版本需要的jdk版本和mysql的驱动版本会更高&#xff0c;可以根据自己的环境选择。 如果是自己玩的话…

开源浏览器Firefox:使用Docker本地部署并远程访问进行测试

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 部署Firefox二. 本地访问Firefox三. Linux安装Cpolar四. 配置Firefox公网地址…

Javaweb之SpringBootWeb案例之 @ConfigurationProperties的详细解析

4.3 ConfigurationProperties 讲解完了yml配置文件之后&#xff0c;最后再来介绍一个注解ConfigurationProperties。在介绍注解之前&#xff0c;我们先来看一个场景&#xff0c;分析下代码当中可能存在的问题&#xff1a; 我们在application.properties或者application.yml中配…