XmlException: Text node cannot appear in this state. Line 1, position 1(Unity读取xml报错,BOM头问题)
Posted 林新发
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XmlException: Text node cannot appear in this state. Line 1, position 1(Unity读取xml报错,BOM头问题)相关的知识,希望对你有一定的参考价值。
一、前言
点关注不迷路,持续输出Unity
干货文章。
嗨,大家好,我是新发。
在Unity
项目开中,我们读取XML
配置表时,如果XML
的编码格式是UTF-8 带BOM头
的话,在移动端解析XML
会报错:
XmlException: Text node cannot appear in this state. Line 1, position 1
特别是多人协作的项目,大家使用的文本编辑器不同,可能其他人就不小心把文件编码修改了,导致出现BOM
头。
那么,我们有没有办法解决这个问题呢?今天就教一下大家吧。
二、什么是BOM头
BOM
是用来判断文本文件是哪一种Unicode
编码的标记,其本身是一个Unicode
字符("\\uFEFF")
,位于文本文件头部。
在不同的Unicode
编码中,对应的BOM
的二进制字节如下:
编码 | 标记 |
---|---|
UTF16BE | 0xfe 0xff |
UTF16LE | 0xff 0xfe |
UTF8 | 0xef 0xbb 0xbf |
我们可以根据文件头部的几个字节和上面的表格对应来判断该文件是哪种编码形式。
在UTF-8
编码文件中,BOM
在文件头部占用三个字节,现在已经有很多软件识别BOM
头,但是还有些不能识别,比如php
就不能识别BOM
头。
三、如何查看文件的编码格式
可以使用Notpad++
打开文本文件,点击菜单编码(N)
即可查看当前文件的编码格式。
Notpad++官网:https://notepad.plus/
我们也可以使用HexEditor
来查看文件头部标识符,首先,我们先在Notepad++
中将编码转为UTF-8-BOM编码
,然后保存。
我们在这里看不到0xef 0xbb 0xbf
这个BOM
头标识符。
这个时候,HexEditor
登场,在HexEditor
中我们看到了这个BOM
头啦。
HexEditor下载地址:https://hexeditor.en.softonic.com/
四、Unity C#如何检测配置表含有BOM头
我们可以在Unity
中做个工具,批量检测配置表是否还有BOM
头。如下,其中cfg1.bytes
是UTF-8 编码
,cfg2.bytes
是UTF-8-BOM 编码
。
CfgBomCheckTools.cs
代码如下:
using UnityEngine;
using System.Collections;
using UnityEditor;
using System.IO;
public class CfgBomCheckTools
{
[MenuItem("GameTools/检测并修复配置表BOM头")]
public static void CheckCfgBom()
{
CheckAndFixBom(GetConfigFiles());
}
//获取目录中的所有配置表文件, .bytes结尾的文件,内容其实是xml
static string[] GetConfigFiles()
{
string dir_name = Application.dataPath + "/ConfigDir/";
return System.IO.Directory.GetFiles(dir_name, "*.bytes", SearchOption.AllDirectories);
}
/// <summary>
/// 检测并修复Bom头
/// </summary>
/// <param name="files"></param>
static void CheckAndFixBom(string[] files)
{
foreach (var f in files)
{
bool hasBom = false;
byte[] bs = File.ReadAllBytes(f);
if (3 <= bs.Length && bs[0] == 0xef && bs[1] == 0xbb && bs[2] == 0xbf)
{
hasBom = true;
}
if(hasBom)
{
var ms = new MemoryStream(bs, 3, bs.Length - 3);
File.WriteAllBytes(f, ms.ToArray());
Debug.LogError(string.Format("配置表有BOM头,自动修复之:{0}", f));
}
}
}
}
点击菜单GameTools/检测配置表BOM头
,
输出结果如下,可以正常检测出来结果。
我们再使用HexEditor
打开cfg2.bytes
看下是否真的没有BOM
头了,如下,没有BOM
头了,说明修复成功了。
五、结束语
完毕。
喜欢Unity
的同学,不要忘记点击关注,如果有什么Unity
相关的技术难题,也欢迎留言或私信~
以上是关于XmlException: Text node cannot appear in this state. Line 1, position 1(Unity读取xml报错,BOM头问题)的主要内容,如果未能解决你的问题,请参考以下文章
XmlException: Text node cannot appear in this state. Line 1, position 1(Unity读取xml报错,BOM头问题)
XmlException: Text node cannot appear in this state. Line 1, position 1(Unity读取xml报错,BOM头问题)
xsd:包含soapUI中的异常:org.apache.xmlbeans.XmlException:org.apache.xmlbeans.XmlException:错误:null之后的文件意外结束(