读取自定义XML时触发System.Xml.XmlException错误求助
问题描述
尝试从自行创建的XML文件提取数据时,持续触发错误:
System.Xml.XmlException: Data at the root level is invalid. Line 1, position 1.
已尝试修改编码(UTF-32/ASCII)、移除XML声明、确认文件路径正确,但问题依旧。
XML创建代码
using (XmlWriter writer = XmlWriter.Create(Path.Combine(location, "config.xml"), new XmlWriterSettings { Indent = true })) { writer.WriteStartDocument(); writer.WriteStartElement("EXMLE"); writer.WriteStartElement("setupData"); writer.WriteElementString("IsOffline", isOffline.ToString().ToLower()); writer.WriteElementString("Username", username); writer.WriteElementString("Password", accPass); writer.WriteElementString("LoginKey", key); writer.WriteElementString("KeyPass", encKey); writer.WriteEndElement(); if (!isOnline) { writer.WriteStartElement("niniteOptions"); writer.WriteElementString("ApplicationLine", applicationLine); writer.WriteEndElement(); writer.WriteStartElement("OSDownload"); writer.WriteElementString("CurrentVersion", currentVersion); writer.WriteElementString("CurrentRelease", currentRelease); writer.WriteElementString("CurrentLanguage", currentLanguage); writer.WriteEndElement(); writer.WriteStartElement("OSConfig"); writer.WriteElementString("OSUsername", osUsername); writer.WriteElementString("OSPassword", osPassword); writer.WriteElementString("DiskNumber", diskNumber); writer.WriteElementString("IsUsingDomain", isUsingDomain.ToString().ToLower()); writer.WriteElementString("DomainLine", domainLine); writer.WriteEndElement(); } writer.WriteEndElement(); writer.WriteEndDocument(); MessageBox.Show("File made!"); }
生成的XML文件内容
<?xml version="1.0" encoding="utf-8"?> <EXMLE> <setupData> <IsOnline>false</IsOnline> <Username>Alice</Username> <Password>*SENSITIVE DATA*</Password> <LoginKey> *SENSITIVE DATA*</LoginKey> <KeyPass>*SENSITIVE DATA*</KeyPass> </setupData> <niniteOptions> <ApplicationLine>'AIMP' + 'foobar2000' </ApplicationLine> </niniteOptions> <OSDownload> <CurrentVersion>10</CurrentVersion> <CurrentRelease>10, version 22H2 [19045.3803] (Updated December 2023)</CurrentRelease> <CurrentLanguage>English</CurrentLanguage> </OSDownload> <OSConfig> <OSUsername>Alice</OSUsername> <OSPassword>*SENSITIVE DATA*</OSPassword> <DiskNumber>2</DiskNumber> <IsUsingDomain>true</IsUsingDomain> <DomainLine>netdom.exe join MainHub /domain:enterprise.net /UserD:Alice /PasswordD:*SENSITIVE DATA*</DomainLine> </OSConfig> </EXMLE>
读取XML的问题代码
private void getText() { XmlDocument doc = new XmlDocument(); doc.Load(xmlLoc); -- 此处触发错误 XmlNode dataNode = doc.SelectSingleNode("/EXMLE/setupData"); if (dataNode.SelectSingleNode("IsOnline").InnerText.ToLower() == "true") { isOnline = true; } else { isOnline = false; } serverUsername = dataNode.SelectSingleNode("Username").InnerText; serverPasswordEnc = dataNode.SelectSingleNode("Password").InnerText; serverKeyEnc = dataNode.SelectSingleNode("LoginKey").InnerText; serverKeyPassEnc = dataNode.SelectSingleNode("KeyPass").InnerText; }
需求:成功从该XML文件提取所需数据,获取解决方法。
解决方法
1. 处理文件开头的BOM隐藏字符
错误提示的核心原因大概率是文件开头存在不可见的BOM(字节顺序标记),XmlDocument加载时无法正确解析。可以通过指定编码禁用BOM识别来解决:
private void getText() { XmlDocument doc = new XmlDocument(); using (StreamReader sr = new StreamReader(xmlLoc, new UTF8Encoding(false))) { doc.Load(sr); } // 后续提取逻辑不变 }
UTF8Encoding(false)会跳过BOM的自动识别,避免解析错误。
2. 替换为更可靠的XDocument API
XDocument是.NET现代XML处理API,对编码和异常的处理更灵活,代码也更简洁:
private void getText() { XDocument doc = XDocument.Load(xmlLoc); var setupData = doc.Element("EXMLE").Element("setupData"); isOnline = setupData.Element("IsOnline").Value.ToLower() == "true"; serverUsername = setupData.Element("Username").Value; serverPasswordEnc = setupData.Element("Password").Value; serverKeyEnc = setupData.Element("LoginKey").Value; serverKeyPassEnc = setupData.Element("KeyPass").Value; }
如果仍遇BOM问题,同样用StreamReader加载:
using (StreamReader sr = new StreamReader(xmlLoc, Encoding.UTF8, detectEncodingFromByteOrderMarks: false)) { XDocument doc = XDocument.Load(sr); // 后续处理逻辑 }
3. 验证文件完整性与路径
- 用文本编辑器打开XML文件,确认开头无乱码、空白字符或截断内容
- 添加调试代码确认文件可访问:
if (!File.Exists(xmlLoc)) { MessageBox.Show($"文件不存在:{xmlLoc}"); return; }
内容的提问来源于stack exchange,提问作者user23372459
相关产品推荐
相关产品推荐

