C# XML文件读取

前言
  • xml也是一种文本格式
  • 我们一般将信息存储在节点属性和节点内容中, 通过遍历获得
步骤
  • 获取根节点
  • 然后获取根节点的所有子节点
  • 遍历节点,将属性值或节点内容赋给实体类的属性
  • C#中内置有对xml的解析库, using System. Xml
  • 注意xml的属性必须带双引号
<SkillInfo>
    <SkillList>
        <Skill
            SkillID="20002" /* 技能ID */
            SkillEngName="Smash" /* 技能英文名称(注:并非所有名称均为规范拼写) */
            TriggerType="1" /* 字面意为技能触发类型,0主要为各种精通类技能,1为主动,2为被动,3主要为敌人主动技能,4主要为炼金术技能,5目前为尚未开放的魔法枪 */
            ImageFile="data/gfx/image/gui_icon_skill_000.dds" /* 技能图标所在文件 */
            AvailableRace="7" /* 可使用该技能的种族,1为人类,2为精灵,4为巨人,3为人类+精灵,5为人类+巨人(知道UNIX文件属性算法的看到这里可能会会心一笑),目前暂无值为6(精灵+巨人)的技能 */
        >
			<Name>重击</Name>
		</Skill>
        <Skill
            SkillID="20003" 
            SkillEngName="Hide" 
            TriggerType="2" 
            ImageFile="data/gfx/image/gui_icon_skill_001.dds" 
            AvailableRace="1" 
        >
			<Name>隐身</Name>
		</Skill>
    </SkillList>
</SkillInfo>
 private void ReadXMLByPath(string path)
    {
        //<1>实例化一个XML文档操作对象.
        XmlDocument doc = new XmlDocument();

        //<2>使用XML对象加载XML.
        doc.Load(path);
		//通过string方式加载
		doc.LoadXml(xmlstr); //xml格式的字符串
        //<3>获取根节点.
        XmlNode root = doc.SelectSingleNode("Web");
      //或者通过以下方式获得
      XmlNode root = doc.FirstChild;
        //<4>获取根节点下所有子节点.
        XmlNodeList nodeList = root.ChildNodes;

        //<5>遍历输出.
        foreach(XmlNode node in nodeList)
        {
            //取属性.
            int id = int.Parse(node.Attributes["id"].Value);
            //取文本.
            string name = node.ChildNodes[0].InnerText;
            string url = node.ChildNodes[1].InnerText;

            Debug.Log(id + "--" + name + "--" + url);
        }

    }
<think>我们被要求提供C#中进行XML文件读写操作的指南。根据引用内容,我们可以总结出几种常见的XML操作方法,包括使用XmlDocument、XmlTextReader以及LINQ to XML。同时,引用中还提到了DOM模型和流模型的区别。我们将按照以下结构组织回答: 1. XML基本概念简介(简要) 2. 使用XmlDocument进行读写(DOM方式) 3. 使用XmlTextReader和XmlTextWriter(流模型) 4. 使用LINQ to XML(更现代的方式) 5. 性能与适用场景对比 6. 最佳实践建议 另外,根据引用[3],DOM方式适合文档较小且需要随机访问和修改的情况,而流模型适合大文件且只读或顺序写入的场景。 我们将给出每种方法的代码示例,并标注引用来源。最后,生成相关问题。 注意:由于引用中并没有提供完整的代码示例,我们将根据引用中的描述和标准C#操作XML的方法来编写示例代码,并适当标注引用。 下面开始组织回答:</think>### C# XML 文件读写操作指南 #### 一、XML 基本概念 XML(可扩展标记语言)是一种结构化数据存储格式,具有以下特点: - 跨平台、自描述性强 - 纯文本格式,易于阅读和编辑 - 树形结构组织数据,支持嵌套元素 - 广泛用于配置文件(如 app.config/web.config)、数据交换等场景[^2][^4] --- #### 二、XML 读取方法 **1. 使用 XmlDocument(DOM 模型)** ```csharp // 读取 XML 文件 XmlDocument doc = new XmlDocument(); doc.Load("config.xml"); // 加载文件 // 获取根节点 XmlNode root = doc.SelectSingleNode("bookstore"); // [^5] // 遍历所有 book 节点 foreach (XmlNode node in root.SelectNodes("book")) { string title = node.SelectSingleNode("title").InnerText; string price = node.SelectSingleNode("price").InnerText; Console.WriteLine($"书名: {title}, 价格: {price}"); } ``` *特点:整个文档加载到内存,适合小型文件操作[^3]* **2. 使用 XmlReader(流模型)** ```csharp using (XmlReader reader = XmlReader.Create("data.xml")) { while (reader.Read()) { if (reader.NodeType == XmlNodeType.Element && reader.Name == "product") { string id = reader.GetAttribute("id"); // 读取属性 reader.ReadToDescendant("name"); // 定位子节点 string name = reader.ReadElementContentAsString(); Console.WriteLine($"产品ID: {id}, 名称: {name}"); } } } ``` *特点:前向只读流式处理,内存占用低,适合大文件[^3]* **3. 使用 LINQ to XML(现代推荐方式)** ```csharp XDocument xdoc = XDocument.Load("employees.xml"); // 查询所有部门为IT的员工 var itStaff = from emp in xdoc.Descendants("employee") where (string)emp.Element("department") == "IT" select new { Name = emp.Element("name").Value, ID = emp.Attribute("id").Value }; foreach (var emp in itStaff) { Console.WriteLine($"IT员工: {emp.Name} ({emp.ID})"); } ``` *优势:语法简洁,支持 LINQ 查询[^2]* --- #### 三、XML 写入与修改 **1. 创建新 XML 文件** ```csharp // 使用 XmlDocument XmlDocument doc = new XmlDocument(); XmlElement root = doc.CreateElement("users"); doc.AppendChild(root); XmlElement user = doc.CreateElement("user"); user.SetAttribute("id", "1001"); user.InnerText = "张三"; root.AppendChild(user); doc.Save("users.xml"); // 保存文件 ``` **2. 修改现有 XML** ```csharp XDocument xdoc = XDocument.Load("config.xml"); // 更新特定节点值 var target = xdoc.Descendants("setting") .FirstOrDefault(e => e.Attribute("key").Value == "Timeout"); if (target != null) target.Attribute("value").Value = "30"; // 添加新节点 xdoc.Root.Add(new XElement("setting", new XAttribute("key", "MaxConnections"), new XAttribute("value", "50"))); xdoc.Save("config_updated.xml"); // 保存修改 ``` **3. 删除节点** ```csharp XmlDocument doc = new XmlDocument(); doc.Load("data.xml"); // 删除所有 price>100 的 book 节点 XmlNodeList books = doc.SelectNodes("/bookstore/book[price>100]"); foreach (XmlNode book in books) { book.ParentNode.RemoveChild(book); } doc.Save("data_updated.xml"); ``` --- #### 四、关键技术与注意事项 1. **XPath 查询** 使用路径表达式定位节点: ```csharp // 选择所有第二级book节点 XmlNodeList nodes = doc.SelectNodes("/*/book"); ``` *常用表达式:`/`(根), `//`(任意位置), `@`(属性), `[]`(条件)* 2. **命名空间处理** ```csharp XmlNamespaceManager ns = new XmlNamespaceManager(doc.NameTable); ns.AddNamespace("ns", "http://example.com/schema"); XmlNode node = doc.SelectSingleNode("//ns:product", ns); ``` 3. **性能优化** - 大型文件使用 `XmlReader` 避免内存溢出 - 批量修改时先加载到内存,完成后统一保存 - 使用 `XmlWriter` 高效生成 XML: ```csharp using (XmlWriter writer = XmlWriter.Create("output.xml")) { writer.WriteStartElement("books"); for (int i = 0; i < 1000; i++) { writer.WriteStartElement("book"); writer.WriteAttributeString("id", i.ToString()); writer.WriteEndElement(); } writer.WriteEndElement(); } ``` 4. **异常处理** ```csharp try { XDocument.Load("corrupted.xml"); } catch (XmlException ex) { Console.WriteLine($"XML解析错误: {ex.Message}"); Console.WriteLine($"错误位置: 行 {ex.LineNumber}, 列 {ex.LinePosition}"); } ``` --- #### 五、应用场景对比 | **方法** | 适用场景 | 内存占用 | 读写能力 | |----------------|---------------------------------|--------|--------------| | `XmlDocument` | 小型文件,需要随机访问/修改 | 高 | 读写 | | `XmlReader` | 大型文件,只读或顺序处理 | 低 | 只读 | | `XmlWriter` | 生成大型XML文件 | 低 | 只写 | | `LINQ to XML` | 中小型文件,需要复杂查询/修改 | 中 | 读写 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值