C# 中利用 XmlDocument 保存和读取相机参数 XML 文件
在 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 ListcameraList) { 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 用于返回解析结果。在实际使用中,建议增加对 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 配置文件管理的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









