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);
        }
    }
     else
        Debug.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()。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

K8S之Pod的介绍和使用

Pod的理论和实操 pod理论说明Pod介绍Pod运行与管理Pod管理多个容器Pod网络Pod存储 Pod工作方式自主式Pod控制器管理的Pod&#xff08;常用&#xff09; 创建pod的流程 pod实操通过资源清单文件创建自主式pod通过kubectl run创建Pod&#xff08;不常用&#xff09; pod理论说明 …

Unity根据落点和抛物线运行时间,求初始力

抛物线运行时长为2秒&#xff1a; 抛物线运行时长为4秒&#xff1a; 原理就是&#xff1a; 在竖直方向只受重力&#xff0c;做匀加速直线运动&#xff0c;水平不受力&#xff0c;做匀速直线运动。 代码&#xff1a; public void Update(){if (Input.GetKeyDown(KeyCode.Space)…

2024.1.30报错记录

今天想调通一套github上的U-net代码&#xff0c;把报错记录一下 第一章 ModuleNotFoundError: No module named skimage 没有这个模块 pip install scikit-image 第二章 TypeError: (‘Keyword argument not understood:‘, ‘input‘) TypeError: (‘Keyword argument …

数据图表方案,企业视频生产数据可视化

在信息爆炸的时代&#xff0c;如何将复杂的数据转化为直观、生动的视觉信息&#xff0c;是企业在数字化转型中面临的挑战。美摄科技凭借其独特的数据图表方案&#xff0c;为企业在数据可视化领域打开了一扇全新的大门。 一、数据图表方案的优势 1、高效便捷&#xff1a;利用数…

文件上传的另类应用

1.Imagemagick CVE-2016-3714 CVE-2022-44268 CVE-2020-29599可在vulhub靶场进行复现1.1.Imagemagick简介 ImageMagic是一款图片处理工具&#xff0c;当传入一个恶意图片时&#xff0c;就有可能存在命令注入漏洞。 ImageMagick默认支持一种图片格式mvg&#xff0c;而mvg与svg…

yii2 mongodb 操作

->where([<>,review,""]) 不等于空 $where [newstypeid>[$in>$categoryIdArr]]; 类似mysql in操作 &#xff08;$categoryIdArr是数组&#xff09; ->where([label>[$regex >赞美诗]]) 模糊搜索操作 $where [status>1,name>[$rege…

sentinel的Context创建流程分析

sentinel入门 功能 限流&#xff1a;通过限制请求速率、并发数或者用户数量来控制系统的流量&#xff0c;防止系统因为流量过大而崩溃或无响应的情况发生。 熔断&#xff1a;在系统出现故障或异常时将故障节点从系统中断开&#xff0c;从而保证系统的可用性。 降级&#xf…

Redis 的持久化机制是什么?各自的优缺点?

Redis 提供两种持久化机制 RDB&#xff08;默认&#xff09; 和 AOF 机制: RDB&#xff1a;是Redis DataBase缩写快照 RDB是Redis默认的持久化方式。按照一定的时间将内存的数据以快照的形式保存到硬盘中&#xff0c;对应产生的数据文件为dump.rdb。通过配置文件中的save参数来…

记录在树莓派中部署PI-Assistant开源项目(GPT语音对话)的BUG

核心 在部署PI-Assistant&#xff08;https://github.com/Lucky-183/PI-Assistant&#xff09;项目中&#xff0c;首先要进行环境安装&#xff0c;官网文档中提供的安装命令如下&#xff1a; pip install requests arcade RPi.GPIO pydub numpy wave sounddevice pymysql cn2…

20.HarmonyOS App(JAVA)表格布局Layout使用方法

ability_main.xml&#xff0c;实现计算器键盘按钮 <?xml version"1.0" encoding"utf-8"?> <TableLayoutxmlns:ohos"http://schemas.huawei.com/res/ohos"ohos:height"match_parent"ohos:width"match_parent"oho…

深度学习手写字符识别:训练模型

说明 本篇博客主要是跟着B站中国计量大学杨老师的视频实战深度学习手写字符识别。 第一个深度学习实例手写字符识别 深度学习环境配置 可以参考下篇博客&#xff0c;网上也有很多教程&#xff0c;很容易搭建好深度学习的环境。 Windows11搭建GPU版本PyTorch环境详细过程 数…

【数据分析】Excel中的常用函数公式总结

目录 0 引用方式0.1 相对引用0.2 绝对引用0.3 混合引用0.4 3D引用0.5 命名引用 1 基础函数1.1 加法、减法、乘法和除法1.2 平均数1.3 求和1.4 最大值和最小值 2 文本函数2.1 合并单元格内容2.2 查找2.3 替换 3 逻辑函数3.1 IF函数3.2 AND和OR函数3.3 IFERROR函数 4 统计函数4.1…

java设计模式:策略模式

在平常的开发工作中&#xff0c;经常会用到不同的设计模式&#xff0c;合理的使用设计模式&#xff0c;可以提高开发效率&#xff0c;提高代码质量&#xff0c;提高代码的可拓展性和维护性。今天来聊聊策略模式。 策略模式是一种行为型设计模式&#xff0c;运行时可以根据需求动…

分布式session 笔记

概念 解决方案‘ 复制 session同步&#xff0c;让集群下的服务器进行session同步&#xff0c;一种传统的服务器集群session管理机制&#xff0c;常用于服务器不多的集群环境。<br /> 集群下&#xff0c;进行session同步的服务器的session数据是相同的&#xff0c;…

vulhub中spring的CVE-2022-22947漏洞复现

Spring Cloud Gateway是Spring中的一个API网关。其3.1.0及3.0.6版本&#xff08;包含&#xff09;以前存在一处SpEL表达式注入漏洞&#xff0c;当攻击者可以访问Actuator API的情况下&#xff0c;将可以利用该漏洞执行任意命令。 参考链接&#xff1a; https://tanzu.vmware.c…

图论练习1

内容&#xff1a;&#xff0c;拆点&#xff0c;分层&#xff0c;传递&#xff0c;带限制的最小生成树 [HNOI2015]菜肴制作 题目链接 题目大意 有个限制&#xff0c;号菜肴在号前完成在满足限制的条件下&#xff0c;按照出菜( 是为了满足的限制 ) 解题思路 由限制&#xf…

寒假 day1

1、请简述栈区和堆区的区别? 2、有一个整形数组:int arr[](数组的值由外部输入决定)&#xff0c;一个整型变量: x(也 由外部输入决定)。要求: 1)删除数组中与x的值相等的元素 2)不得创建新的数组 3)最多只允许使用单层循环 4)无需考虑超出新数组长度后面的元素&#xff0c;所以…

2024美赛数学建模D题思路分析 - 大湖区水资源问题

1 赛题 问题D&#xff1a;大湖区水资源问题 背景 美国和加拿大的五大湖是世界上最大的淡水湖群。这五个湖泊和连接的水道构成了一个巨大的流域&#xff0c;其中包含了这两个国家的许多大城市地区&#xff0c;气候和局部天气条件不同。 这些湖泊的水被用于许多用途&#xff0…

【数据分享】1929-2023年全球站点的逐日降雪深度数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、能见度等指标&#xff0c;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 之前我们分享过1929-2023年全球气象站点的逐日平均气温数据、逐日最高气温数据…

二维图像生成 3D 场景:nerfstudio 帮你简化流程 | 开源日报 No.164

nerfstudio-project/nerfstudio Stars: 7.7k License: Apache-2.0 nerfstudio 是一个友好的 NeRFs 协作工作室。 该项目旨在简化创建、训练和测试 NeRFs 的端到端流程&#xff0c;支持更模块化的 NeRFs 实现&#xff0c;并提供了简单的 API。 其主要功能和优势包括&#xff1…