0

0

C# Linq to XML创建文件 使用XElement构建XML文档

煙雲

煙雲

发布时间:2026-02-22 12:26:03

|

141人浏览过

|

来源于php中文网

原创

xelement 本身不包含 xml 声明,需用 xdocument 包裹并设置 xdeclaration 才能生成带声明的 xml 文件;编码乱码源于声明与实际写入编码不一致;结构易错因属性与子元素混在同一参数列表;大文件应改用 xmlwriter 流式写入。

c# linq to xml创建文件 使用xelement构建xml文档

XElement 创建 XML 文件时,为什么生成的文件没有声明(XML declaration)?

因为 XElement 本身不包含 XML 声明(如 <?xml version="1.0" encoding="utf-8"?>),它只代表一个元素节点。要写入带声明的文件,必须用 XDocument 包一层。

  • XDocument 是整个文档的容器,支持设置 DeclarationRoot 和注释等文档级信息
  • 直接调用 XElement.Save("path.xml") 会跳过声明,哪怕你手动加了 <?xml ...?> 字符串也会被当作文本节点处理
  • 正确做法是:先构造 XDocument,把 XElement 设为它的 Root,再调用 Save

示例:

XElement root = new XElement("config",
    new XElement("timeout", "30"),
    new XElement("retries", "3")
);
XDocument doc = new XDocument(
    new XDeclaration("1.0", "utf-8", "yes"),
    root
);
doc.Save("config.xml");

中文字符乱码或保存后变成问号?检查 XDeclaration 的 encoding 和实际写入编码是否一致

常见现象:XML 文件打开显示一堆 ,或者 Notepad++ 显示“UTF-8 with BOM”但内容仍是乱码。根本原因是声明里写的 encoding 和底层流/文件系统实际使用的编码不匹配。

  • XDeclaration 第二个参数只是“告诉解析器怎么读”,不是“强制转换编码”。它不改变字符串本身的字节序列
  • 如果字符串是 UTF-16(C# 默认 string 编码),而你声明 "utf-8" 却没做转换,保存时 StreamWriter 会按 UTF-8 写入 UTF-16 字节 → 必然乱码
  • 最稳做法:显式用 XmlWriter 控制编码,或确保 XDocument.Save() 走的是文本编码明确的路径

安全写法(绕过默认编码猜测):

using (var writer = XmlWriter.Create("data.xml", 
    new XmlWriterSettings { Encoding = Encoding.UTF8, Indent = true }))
{
    doc.Save(writer);
}

嵌套层级深、属性多时,XElement 构造容易写错顺序或漏逗号

这不是语法错误,而是人眼难以校验的结构陷阱。比如想写 <user id="123"><name>Alice</name></user>,但手抖把 new XAttribute 放在子元素后面,结果属性就跑到闭合标签外了。

e网企业2.0
e网企业2.0

一款适用于中小企业自助建站程序,是c#与xml技术相结合的产物,支持动态设定二级栏目,采用了开放式架构,建站模版自由添加。程序整合了(单一文本,新闻列表,图片列表 ,在线订单, 文件下载 , 留言板)六类插件,以所见即所得的方式,将烦锁的建站过程简化到三步,使用户可以轻松上手。 管理后台:manage.aspx 初始密码均为admin

下载
  • XElement 构造函数签名是 XElement(string name, params object[] content),所有参数都算 content —— 属性和子元素混在同一参数列表里,靠类型区分
  • 属性必须放在子元素前面,否则会被当成文本节点或非法内容(运行时报 ArgumentException
  • 建议拆成多行 + 注释,或用链式写法(.Add())分步构建,尤其涉及条件分支时

对比:

// ❌ 容易出错:属性在后,且无换行
new XElement("user", new XElement("name", "Alice"), new XAttribute("id", "123"))
<p>// ✅ 清晰:属性优先,分行对齐
new XElement("user",
new XAttribute("id", "123"),
new XElement("name", "Alice")
)

大文件导出性能差?别用 XDocument 全量内存构建

当你要生成几万行 XML(比如日志归档、批量导出),全部塞进 XDocument 会吃光内存,GC 压力大,还可能触发 OutOfMemoryException

  • XDocumentXElement 都是 DOM 模型,整棵树驻留内存;而真实场景中多数只需“写一次、不读取”
  • 换成 XmlWriter 流式写入:固定内存占用,速度更快,还能控制缩进、命名空间前缀等细节
  • 如果仍想用 LINQ to XML 的表达力,可组合使用:用 XElement 构建单条记录,再用 XmlWriter 逐条写入

关键点:不要为了“统一风格”硬套 XDocument.Save(),流式才是生产环境的大文件解法。

生成带声明、正确编码、结构清晰、可扩展的 XML,核心不在语法多炫,而在选对抽象层级——该用 XDocument 时别省那两行代码,该切到 XmlWriter 时也别硬扛内存。最容易被忽略的是:声明里的 encoding 不是魔法开关,它和实际写入行为必须同步。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

810

2023.08.02

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1931

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2107

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

1134

2024.11.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

616

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

217

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1557

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

642

2023.11.24

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

928

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

相关下载

更多

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 9.9万人学习

C 教程
C 教程

共75课时 | 4.9万人学习

C++教程
C++教程

共115课时 | 18.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号