XmlDocument.LoadXml上的坑

探讨使用XmlDocument在.NET中加载XML文档的不同方法及注意事项,特别是UTF-8 BOM处理的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

XmlDocument加载xml文档,可以用Load加载实体文件,也可以用LoadXml加载字符串,但是使用的时候有个小坑需要注意。先来看以下几行代码:

1
2
3
4
var xml = new XmlDocument();
xml.Load("test.xml");                                                // <--- 方法1
xml.LoadXml(File.ReadAllText("test.xml", Encoding.UTF8));            // <--- 方法2
xml.LoadXml(Encoding.UTF8.GetString(File.ReadAllBytes("test.xml"))); // <--- 方法3


运行一下,会发现方法1和2没什么区别,但方法3会报错:

1
System.Xml.XmlException: 根级别上的数据无效。 第 1 行,位置 1。


原因出在UTF8的BOM上,Windows系统下,UTF8文件保存会在头部保存3个字节,EF BB BF,如果按文本方式处理文件(File.ReadAllText),得到的字符串是不会包含这3个不可见字符的,但如果用二进制方式处理文件再转字符串(File.ReadAllBytes再GetString),得到的字符串就有问题了,导致XmlDocument认为XML格式不合法。


对本地文件来说,一般不太可能用到方法3,但是如果是从远程接收文件,就会遇到与方法3类似的情况了,此时需要识别一下,如果有BOM,要去除掉再转化字符串。




    本文转自 BoyTNT 51CTO博客,原文链接:http://blog.51cto.com/boytnt/1585979,如需转载请自行联系原作者

Building Library\Bee\artifacts\Android\Manifest\LauncherManifestDiag.txt failed with output: System.Xml.XmlException: Name cannot begin with the '<' character, hexadecimal value 0x3C. Line 11, position 18. at System.Xml.XmlTextReaderImpl.Throw(Exception e) at System.Xml.XmlTextReaderImpl.Throw(String res, String[] args) at System.Xml.XmlTextReaderImpl.ParseQName(Boolean isQName, Int32 startOffset, Int32& colonPos) at System.Xml.XmlTextReaderImpl.ParseElement() at System.Xml.XmlTextReaderImpl.ParseElementContent() at System.Xml.XmlTextReaderImpl.Read() at System.Xml.XmlLoader.LoadNode(Boolean skipOverWhitespace) at System.Xml.XmlLoader.LoadDocSequence(XmlDocument parentDoc) at System.Xml.XmlLoader.Load(XmlDocument doc, XmlReader reader, Boolean preserveWhitespace) at System.Xml.XmlDocument.Load(XmlReader reader) at System.Xml.XmlDocument.LoadXml(String xml) at Unity.Android.Gradle.AndroidXmlDocument..ctor(String contents) at Unity.Android.Gradle.AndroidManifest..ctor(String contents) at AndroidPlayerBuildProgram.Actions.GenerateManifests..ctor(Arguments arguments) at AndroidPlayerBuildProgram.Actions.GenerateManifests.Run(CSharpActionContext context, Arguments arguments) UnityEditor.BuildPipeline:BuildPlayer (string[],string,UnityEditor.BuildTarget,UnityEditor.BuildOptions) TTSDK.Tool.StarkBuilder:StartBuild (string,UnityEditor.BuildOptions,bool&) TTSDK.Tool.StarkBuilder:Build (TTSDK.Tool.StarkBuilderSettings,bool&,string&,bool) TTSDK.Tool.StarkSDKToolWindow/<BuildApk>d__53:MoveNext () System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1<bool>:Start<TTSDK.Tool.StarkSDKToolWindow/<BuildApk>d__53> (TTSDK.Tool.StarkSDKToolWindow/<BuildApk>d__53&) TTSDK.Tool.StarkSDKToolWindow:BuildApk (bool) TTSDK.Tool.StarkSDKToolWindow:DrawCommandButtons () TTSDK.Tool.StarkSDKToolWindow:OnGUI () UnityEngine.GUIUtility:ProcessEvent (int,intptr,bool&)
最新发布
03-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值