You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

读取自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 20:33:27