C# 中利用 XmlDocument 保存和读取相机参数 XML 文件

远山来客
远山来客
发布时间:2026-10-15 | 5人浏览过
原创

在 C# 应用开发中,经常需要持久化存储配置数据。本文展示如何使用 System.Xml 命名空间下的 XmlDocument 类,将相机参数(如 ID、曝光、增益)序列化为 XML 文件,并从 XML 文件反序列化回内存对象,附带完整的 WinForms 按钮事件处理代码。

1. 准备环境与核心思路

C# 操作 XML 主要依赖 System.Xml 命名空间。对于结构相对固定且层级不深的配置数据(如相机参数),使用 XmlDocument API 可以直观地创建元素、设置属性和填充文本内容,适合初学者理解 XML 文档对象模型(DOM)的操作逻辑。

我们的目标是通过两个静态方法完成核心功能:

  • 生成 XML:遍历相机参数列表,构建根节点及子节点,保存为文件。
  • 读取 XML:加载文件,定位根节点,遍历子节点提取属性值与文本内容,重组为对象列表。

2. 实现相机参数类的封装

首先需要定义承载相机数据的实体类 Camera,包含标识符、曝光值和增益值。接着创建工具类 CameraXML,用于执行具体的 XML 读写操作。

第1步:定义数据模型与写入逻辑

目的:建立数据结构并提供将内存数据转换为 XML 文件的接口。
入口:在项目中添加一个新的类文件。
动作:编写 Camera 类作为数据载体,并在 CameraXML 中实现 GenerateCameraXMLFile 方法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;

namespace xmlTest
{
    // 相机数据模型
    public class Camera
    {
        public string camID;
        public int camExposure;
        public int camGain;

        public Camera()
        {
            camID = "nullID";
            camExposure = 5000;
            camGain = 0;
        }

        public Camera(string camID, int camExposure, int camGain)
        {
            this.camID = camID;
            this.camExposure = camExposure;
            this.camGain = camGain;
        }
    }

    // XML 操作工具类
    public static class CameraXML
    {
        /// 
        /// 创建相机XML文件
        /// 
        /// 存储路径
        /// 相机列表
        public static void GenerateCameraXMLFile(string xmlFilePath, List cameraList)
        {
            try
            {
                // 初始化一个xml实例
                XmlDocument myXmlDoc = new XmlDocument();
                // 创建xml的根节点
                XmlElement rootElement = myXmlDoc.CreateElement("Cameras");
                // 将根节点加入到xml文件中
                myXmlDoc.AppendChild(rootElement);

                foreach (var item in cameraList)
                {
                    // 初始化第一层的第一个子节点 (Camera)
                    XmlElement firstLevelElement1 = myXmlDoc.CreateElement("Camera");
                    // 填充属性值 (SetAttribute)
                    firstLevelElement1.SetAttribute("ID", item.camID);
                    // 将第一层的第一个子节点加入到根节点下
                    rootElement.AppendChild(firstLevelElement1);

                    // 初始化第二层的第一个子节点 (Exposure)
                    XmlElement secondLevelElement11 = myXmlDoc.CreateElement("Exposure");
                    // 填充值 (InnerText)
                    secondLevelElement11.InnerText = item.camExposure.ToString();
                    firstLevelElement1.AppendChild(secondLevelElement11);

                    // 初始化第二层的第二个子节点 (Gain)
                    XmlElement secondLevelElement12 = myXmlDoc.CreateElement("Gain");
                    secondLevelElement12.InnerText = item.camGain.ToString();
                    firstLevelElement1.AppendChild(secondLevelElement12);
                }

                // 将xml文件保存到指定的路径下
                myXmlDoc.Save(xmlFilePath);

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
    }
}

关键参数说明:xmlFilePath 指定输出路径(例如 D:\Cameras.xml),cameraList 为待保存的 Camera 对象集合。生成的 XML 结构如下:

<Cameras>
  <Camera ID="L1023...">
    <Exposure>4500</Exposure>
    <Gain>0</Gain>
  </Camera>
</Cameras>

第2步:实现 XML 读取与解析逻辑

目的:从已有的 XML 文件中恢复相机参数数据。
入口:在 CameraXML 类中添加新方法。
动作:使用 Load 加载文件,通过 SelectSingleNode 定位根节点,遍历子节点并提取数据。

    public static void ReadCameraXMLFile(string xmlFilePath, out List cameraList)
    {
        cameraList = new List();

        // 初始化一个xml实例
        XmlDocument myXmlDoc = new XmlDocument();
        // 加载xml文件
        myXmlDoc.Load(xmlFilePath);
        // 获得根节点
        XmlNode rootNode = myXmlDoc.SelectSingleNode("Cameras");

        if (rootNode != null)
        {
            // 获得该节点的子节点集合(即所有的 Camera 节点)
            XmlNodeList firstLevelNodeList = rootNode.ChildNodes;

            try
            {
                foreach (XmlNode node in firstLevelNodeList)
                {
                    Camera camera = new Camera();
                    // 获取属性集合 (ID)
                    XmlAttributeCollection attributeCol = node.Attributes;
                    foreach (XmlAttribute attri in attributeCol)
                    {
                        if (attri.Name == "ID")
                        {
                            camera.camID = attri.Value;
                        }
                    }

                    // 判断此节点是否还有子节点
                    if (node.HasChildNodes)
                    {
                        // 获取第一个子节点 Exposure
                        XmlNode secondLevelNode1 = node.FirstChild;
                        string innerText = secondLevelNode1.InnerText;
                        camera.camExposure = Convert.ToInt16(innerText);

                        // 获取第二个子节点 Gain
                        XmlNode secondLevelNode2 = node.ChildNodes[1];
                        innerText = secondLevelNode2.InnerText;
                        camera.camGain = Convert.ToInt16(innerText);
                    }

                    cameraList.Add(camera);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
    }

注意:out List cameraList 用于返回解析结果。在实际使用中,建议增加对 rootNode 是否为空的判断,以增强代码健壮性。

3. 在 WinForms 中的应用示例

以下代码展示了如何在 Windows 窗体应用中调用上述类,实现点击按钮生成 XML 文件和读取 XML 文件到列表框的功能。

第3步:绑定界面事件与执行操作

目的:验证 XML 读写流程的正确性。
入口:Form1.cs 代码视图。
动作:在按钮点击事件中构造测试数据并调用 CameraXML 方法。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml;

namespace xmlTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void buttonGenerateCameraXMLFile_Click(object sender, EventArgs e)
        {
            // 构造测试数据
            List cameraList = new List();
            cameraList.Add(new Camera("L102314123", 4500, 0));
            cameraList.Add(new Camera("L102314124", 5500, 0));
            cameraList.Add(new Camera("L102314125", 3500, 1));
            cameraList.Add(new Camera("L102314126", 6500, 0));
            cameraList.Add(new Camera("L102314127", 4880, 0));
            cameraList.Add(new Camera("L102314128", 9500, 0));
            cameraList.Add(new Camera("L102314129", 4530, 0));
            cameraList.Add(new Camera("L102314130", 13200, 0));

            // 执行写入
            CameraXML.GenerateCameraXMLFile("D:\\Cameras.xml", cameraList);
            MessageBox.Show("XML文件已生成至 D:\\Cameras.xml");
        }

        private void buttonReadCameraXMLFile_Click(object sender, EventArgs e)
        {
            List cameraList = new List();
            // 执行读取
            CameraXML.ReadCameraXMLFile("D:\\Cameras.xml", out cameraList);

            // 清空旧数据显示
            listBox1.Items.Clear();
            foreach (var item in cameraList)
            {
                listBox1.Items.Add($"ID: {item.camID}");
                listBox1.Items.Add($"Exposure: {item.camExposure}");
                listBox1.Items.Add($"Gain: {item.camGain}");
                listBox1.Items.Add("---");
            }
        }
    }
}

执行后,界面效果如下所示:

4. 注意事项与排错

在使用 XmlDocument 进行文件操作时,需注意以下几点:

  • 路径权限:若指定路径(如 D:\)受系统保护或不存在,myXmlDoc.Save() 可能抛出异常。建议先检查目录是否存在或使用 Path.Combine 确定用户可写目录。
  • 编码格式:XmlDocument 默认使用 UTF-16 编码。如果需要特定的编码(如 UTF-8),可以在保存前手动设置 XmlDeclaration。
  • 空引用处理:在读取节点时,始终检查 node 或 secondLevelNode 是否为 null,防止因 XML 格式错误导致 NullReferenceException。

以上就是 C# 中使用 XmlDocument 操作相机参数 XML 文件的详细内容,更多关于 C# XML 配置文件管理的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表