You need to enable JavaScript to run this app. C#使用XmlReader读取XML Background节点到TextBox时遇无效XmlNodeType异常
优惠活动
大模型
产品
解决方案
定价
更多

C#使用XmlReader读取XML Background节点到TextBox时遇无效XmlNodeType异常

XML读取功能的问题排查与修复实现

现存代码的核心错误

  • 语法级致命问题:循环语句while (XDoc.Read());末尾多了冗余分号。该写法会让循环持续空转读取所有XML节点,直到整个文件读取完毕、流到达末端,此时XmlReader的节点类型为None,后续调用ReadElementString()时就会触发对应的'None' is an invalid XmlNodeType异常。
  • 逻辑设计错位:原本的判断逻辑虽然识别到了<Background>节点,但没有在定位到节点的当下提取节点文本,反而等全文件遍历完成后才尝试读取元素值,完全无法回溯获取已读过的节点内容。
  • 资源隐患:XmlReader实例没有用using包裹自动释放,长时间运行可能出现文件占用问题。
  • 格式隐患:你提供的XML示例缺失根节点ArrayOfXMLSaveClass的闭合标签,实际读取前需要补全格式,否则会触发XML格式校验错误。

修复实现

方案1:基于现有XmlReader逻辑修正

直接调整语法错误,在匹配到目标节点的当下完成值提取:

private void button4_Click(object sender, EventArgs e)
{
    OpenFileDialog OP = new OpenFileDialog();
    OP.Filter = "XML files (*.xml)|*.xml";
    OP.DefaultExt = "xml";
    OP.AddExtension = true;
    if (OP.ShowDialog() == DialogResult.OK)
    {
        string backgroundValue = string.Empty;
        // using块自动释放XmlReader资源
        using (XmlReader xmlReader = XmlReader.Create(OP.FileName))
        {
            // 移除循环末尾的冗余分号
            while (xmlReader.Read())
            {
                // 匹配到目标节点时立刻读取文本值
                if (xmlReader.NodeType == XmlNodeType.Element && xmlReader.Name == "Background")
                {
                    backgroundValue = xmlReader.ReadElementContentAsString();
                    break; // 定位到目标值后即可终止遍历
                }
            }
        }
        txtInputFileT.Text = backgroundValue;
    }
}

方案2:更适配当前XML结构的Linq to XML实现

无需手动逐节点遍历,按层级定位目标值,代码更简洁、出错概率更低:

private void button4_Click(object sender, EventArgs e)
{
    OpenFileDialog OP = new OpenFileDialog();
    OP.Filter = "XML files (*.xml)|*.xml";
    OP.DefaultExt = "xml";
    OP.AddExtension = true;
    if (OP.ShowDialog() == DialogResult.OK)
    {
        XDocument xmlDoc = XDocument.Load(OP.FileName);
        // 全局查找名为Background的节点
        var backgroundNode = xmlDoc.Descendants("Background").FirstOrDefault();
        txtInputFileT.Text = backgroundNode != null 
            ? backgroundNode.Value 
            : "未找到指定Background节点";
    }
}

内容的提问来源于stack exchange,提问作者EdV

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.02 08:24:03