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

news2024/11/15 23:41:47

前言

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()。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【力扣hot100】刷题笔记Day3

前言 以撒真是一不小心就玩太久了&#xff0c;终于解锁骨哥嘞&#xff0c;抓紧来刷题&#xff0c;今天是easy双指针&#xff01; 283. 移动零 - 力扣&#xff08;LeetCode&#xff09; 一个指针遍历&#xff0c;一个指针用于交换前面的0 class Solution(object):def moveZer…

简单说说mysql的日志

今天我们通过mysql日志了解mysqld的错误日志、慢查询日志、二进制日志&#xff0c;redolog, undolog等。揭示它们的作用和用途&#xff0c;让我们工作中更能驾驭mysql。 redo 日志 如果mysql事务提交后发生了宕机现象&#xff0c;那怎么保证数据的持久性与完整性&#xff1f;…

《计算机网络简易速速上手小册》第6章:网络性能优化(2024 最新版)

文章目录 6.1 带宽管理与 QoS - 让你的网络不再拥堵6.1.1 基础知识6.1.2 重点案例&#xff1a;提高远程办公的视频会议质量实现步骤环境准备Python 脚本示例注意事项 6.1.3 拓展案例1&#xff1a;智能家居系统的网络优化实现思路Python 脚本示例 6.1.4 拓展案例2&#xff1a;提…

挑战杯 LSTM的预测算法 - 股票预测 天气预测 房价预测

0 简介 今天学长向大家介绍LSTM基础 基于LSTM的预测算法 - 股票预测 天气预测 房价预测 这是一个较为新颖的竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-senior/postgraduate 1 基于 Ke…

Megatron-LM源码系列(七):Distributed-Optimizer分布式优化器实现Part2

1. 使用入口 DistributedOptimizer类定义在megatron/optimizer/distrib_optimizer.py文件中。创建的入口是在megatron/optimizer/__init__.py文件中的get_megatron_optimizer函数中。根据传入的args.use_distributed_optimizer参数来判断是用DistributedOptimizer还是Float16O…

QSlider使用笔记

最近做项目使用到QSlider滑动条控件&#xff0c;在使用过的过程中&#xff0c;发现一个问题就是点滑动条上的一个位置&#xff0c;滑块并没有移动到鼠标点击的位置&#xff0c;体验感很差&#xff0c;于是研究了下&#xff0c;让鼠标点击后滑块移动到鼠标点击的位置。 1、event…

this指针详细总结 | static关键字 | 静态成员

文章目录 1.this指针引入2.this指针的特性3.静态成员3.1.C语言中static的基本用法3.2.C中的static关键字 1.this指针引入 class student { public:student(const string& name){ _name name; }void print(){// _name<>this->_name<>(*this)._name// 说一下…

【Linux】打包压缩跨系统/网络传输文件常用指令完结

Hello everybody!在今天的文章中我会把剩下的3-4个常用指令讲完&#xff0c;然后开始权限的讲解。那废话不多说&#xff0c;咱们直接进入正题&#xff01; 1.zip/unzip&tar命令 1.zip/unzip 在windows系统中&#xff0c;经常见到带有zip后缀的文件。那个东西就是压缩包。…

携程网首页案例制作

背景线性渐变 语法&#xff1a; background&#xff1a;linear-gradient&#xff08;起始方向&#xff0c;颜色1&#xff0c;颜色2&#xff0c;...&#xff09;&#xff1b; background&#xff1a;-webkit-linear-gradient&#xff08;left&#xff0c;red&#xff0c;blue&a…

使用Python的turtle模块实现简单的烟花效果

import turtle import random import math# 设置窗口大小 width, height 800, 600 screen turtle.Screen() screen.title("Fireworks Explosion") screen.bgcolor("black") screen.setup(width, height)# 定义烟花粒子类 class Particle(turtle.Turtle):…

ES6-let

一、基本语法 ES6 中的 let 关键字用于声明变量&#xff0c;并且具有块级作用域。 - 语法&#xff1a;let 标识符;let 标识符初始值; - 规则&#xff1a;1.不能重复声明let不允许在相同作用域内重复声明同一个变量2.不存在变量提升在同一作用域内&#xff0c;必须先声明才能试…

论文阅读-一种用于大规模分布式文件系统中基于深度强化学习的自适应元数据管理方案

名称&#xff1a; An Adaptive Metadata Management Scheme Based on Deep Reinforcement Learning for Large-Scale Distributed File Systems I. 引言 如今&#xff0c;大型集群文件系统的规模已达到PB甚至EB级别&#xff0c;由此产生的数据呈指数级增长。系统架构师不断设…

算法学习——华为机考题库7(HJ41 - HJ45)

算法学习——华为机考题库7&#xff08;HJ41 - HJ45&#xff09; HJ41 称砝码 描述 现有n种砝码&#xff0c;重量互不相等&#xff0c;分别为 m1,m2,m3…mn &#xff1b; 每种砝码对应的数量为 x1,x2,x3…xn 。现在要用这些砝码去称物体的重量(放在同一侧)&#xff0c;问能称…

STM32--揭秘中断(简易土货版)

抢占优先级响应优先级 视频学习--中断​​​​​​​

数据结构----队列(Queue)的概念、队列的使用、模拟实现队列、循环队列、模拟实现循环队列、双端队列、模拟实现双端队列

文章目录 1 概念2 队列的使用3 队列模拟实现4 循环队列4.1 循环队列 概念4.1 循环队列模拟实现 5. 双端队列 (Deque)6 用队列实现栈7 用栈实现队列 1 概念 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有…

会计的记账凭证

目录 一. 记账凭证的填制与审核1.1 收付款凭证1.2 转账凭证1.3 单式记账凭证 二. 记账凭证的编号 \quad 一. 记账凭证的填制与审核 \quad \quad 1.1 收付款凭证 \quad 注意︰ 凡是涉及货币资金之间收付款的业务如将库存现金存入银行或从银行提取现金等类经济业务。在实际工作中…

macOS的设置与常用软件(含IntelliJ IDEA 2023.3.2 Ultimate安装,SIP的关闭与开启)

目录 1 系统设置1.1 触控板1.2 键盘 2 软件篇2.1 [科学上网](https://justmysocks5.net/members/)2.1 [安装Chrome浏览器](https://www.google.cn/chrome/index.html)2.2 [安装utools](https://www.u.tools)2.3 [安装搜狗输入法](https://shurufa.sogou.com/)2.4 [安装snipaste…

Qt多语言翻译

Qt多语言翻译概述 Qt提供了非常简单易用的多语言翻译机制&#xff0c;其核心类为QTranslator.概括来说就是利用Qt的lupdate工具将项目中所有tr函数包裹的字符串提取到.ts文件中&#xff0c;然后使用Qt Linguist由专门的翻译人员对提取的.ts文件进行逐个单词短语的翻译工作. 翻译…

MkDocs 部署指南

简介 MkDocs 可以同时编译多个 markdown 文件&#xff0c;形成书籍一样的文件。有多种主题供你选择&#xff0c;很适合项目使用。 MkDocs 是快速&#xff0c;简单和华丽的静态网站生成器&#xff0c;可以构建项目文档。文档源文件在 Markdown 编写&#xff0c;使用单个 YAML …

绝世唐门:霍挂六个十万年魂环,一穿七灭团再现,淘汰赛顺利晋级

Hello,小伙伴们&#xff0c;我是拾荒君。 国漫《斗罗大陆2绝世唐门》第32期超前爆料&#xff0c;霍雨浩开局便释放六个十万年魂环&#xff0c;以绝对的气场碾压天灵学院代表队。首次参与高级魂师大赛&#xff0c;霍雨浩便大放异彩秀出超级霍挂&#xff0c;此等操作就连当初的唐…