XDocument保存为xml文件的方法如下:

XDocument doc = new XDocument(new XDeclaration("1.0","UTF-8",null),new XElement("Persons",                         new XElement("Person",new XAttribute("id","1"),new XElement("Name","张三"),new XElement("Age",18))                  ));
doc.Save("person.xml");

person.xml打开时有第一行的版本和编码声明:

<?xml version="1.0" encoding="utf-8"?>

<Persons>
  <Person id="1">
    <Name>张三</Name>
    <Age>18</Age>
  </Person>
</Persons>

但是有时不想保存为文件,直接获取上面内容为保存在一个string中:
string xml = doc.ToString();

此时xml的值为下面,获取不到xml第一行的声明:
<Persons>
  <Person id="1">
    <Name>张三</Name>
    <Age>18</Age>
  </Person>
</Persons>

解决方法有几种:

第1种,比较简单:

string xml = doc.Declaration.ToString() + doc.ToString();

第2种,写个扩展方法

 public static string ToStringWithDeclaration(this XDocument doc, SaveOptions options = SaveOptions.DisableFormatting){return doc.Declaration.ToString() + doc.ToString(options);}

调用:

string xml = doc.ToStringWithDeclaration();

第3种,同样写个扩展方法封装起来

public static string ToStringWithDeclaration(this XDocument doc){StringBuilder sb = new StringBuilder();using (TextWriter tw = new StringWriter(sb)){               doc.Save(tw, SaveOptions.DisableFormatting);}         return sb.ToString();}

这种方法有个问题是 生成的编码声明变成了encoding="utf-16",要想换成encoding="utf-8"可
写个类Utf8StringWriter继承StringWriter,并设置重载属性Encoding为UTF8,完整代码如下

 public class Utf8StringWriter : StringWriter{public Utf8StringWriter(StringBuilder sb) : base(sb){ }public override Encoding Encoding { get { return Encoding.UTF8; } }}public static string ToStringWithDeclaration(this XDocument xdoc){StringBuilder sb = new StringBuilder();using (TextWriter tw = new Utf8StringWriter(sb)){   xdoc.Save(tw, SaveOptions.DisableFormatting);}return sb.ToString();}

备注:

XDocument.ToString 方法有2个重载列表,可以设置XML节点是否缩进

名称                                      说明
ToString()                            返回此节点的缩进 XML。
ToString(SaveOptions)     返回此节点的 XML,还可以选择禁用格式设置。

SaveOptions有两个枚举值:
   DisableFormatting 不缩进
   None                         缩进

XDocument.Save 方法也有个参数SaveOptions可以设置。

参考文章:
http://msdn.microsoft.com/zh-cn/library/vstudio/bb538297%28v=vs.90%29.aspx
http://stackoverflow.com/questions/1228976/xdocument-tostring-drops-xml-encoding-tag
http://stackoverflow.com/questions/5248400/why-does-the-xdocument-give-me-a-utf16-declaration

转载于:https://www.cnblogs.com/suncoolcat/p/3315567.html

XDocument 获取包括第一行的声明(版本、编码)的所有节点相关推荐

  1. asp.net gridview删除 获取到第一行第一列的单元格内容_VBA中的常用单元格引用方式...

    VBA编程经常和"对象"打交道,其中最频繁的对象大概就是"单元格"了.(听说您还没有对象?那--我想你大概需要一份Excel,包邮988--) 今天我们就来聊一 ...

  2. bash shell sed 获取第一行_老司机给出的关于 shell 脚本的8个建议,必收!

    这八个建议,来源于键者几年来编写 shell 脚本的一些经验和教训.事实上开始写的时候还不止这几条,后来思索再三,去掉几条无关痛痒的,最后剩下八条.毫不夸张地说,每条都是精挑细选的,虽然有几点算是老生 ...

  3. 三线表是什么?R语言使用table1包绘制(生成)三线表、使用单变量分列构建三线表、通过topclass参数自定义三线表表格的显示形式(显示为类似斑马线、并将所有列居中,包括包含行标签的第一列)

    三线表是什么?R语言使用table1包绘制(生成)三线表.使用单变量分列构建三线表.通过topclass参数自定义三线表表格的显示形式(显示为类似斑马线.并将所有列居中,包括包含行标签的第一列) 目录

  4. C语言试题九十二之输入数据有多行,第一行是一个整数n,表示测试用例的个数,后面跟着n行 ,每行包括一个由字母和数字组成的字符串

    ​ 1.题目 输入 输入数据有多行,第一行是一个整数n,表示测试用例的个数,后面跟着n行,每行包括一个由字母和数字组成的字符串 输出 对于妈给测试用例,输出该字符串中数值的个数,每个输出占一行 样式输 ...

  5. datatable中某一列最小值_Asp.net中获取DataTable选择第一行某一列值

    数据源是一个DataTable,现在我们需要获取这个DataTable的第一行第一列的值. 先准备一个数据集,创建一个DataTable,并填充数据: source code: using Syste ...

  6. Android 学习之《第一行代码》第6章:adb调试:pemission denied以及模拟器不能获取root权限问题的解决

    问题描述: <第一行代码>第六章用ADB工具打开数据库过程中,cd 命令直接报 permission denied,想着应该是权限不够,于是尝试输入su .sudo.su root.adb ...

  7. Epplus获取数据区域的第一行或最后一行

    使用Epplus编辑表格文件时,有时需要知道表格中数据的第一行或最后一行,以便追加数据.此时可通过下列方法获取: //获得有数据的区域var lastAddress = worksheet.Dimen ...

  8. java获取excel文件第一行_java - 在Java中读取Excel文件,但第一行除外 - 堆栈内存溢出...

    我正在尝试从使用xlsx文件的JasperReport模板自动创建报告,我用来从excel文件读取的方法是这样的: String[] columnNames = new String[]{" ...

  9. 给第一行单元格赋值WPS JS获取工作表的总行数WPS JS获取工作表的总行数

    戳我,了解更多相关办公的小技巧 给第一行单元格赋值 1.在计算机中有一种ASCII编码,其中A在计算机中的表示的数字是65,a的ascii码是97,b的ascii码是98. 2.从A1到F1可以看到第 ...

最新文章

  1. 夏天和空调_您可以在今年夏天开始学习650项免费的在线编程和计算机科学课程...
  2. 在linux系统使用nginx部署静态网页
  3. C#在winform中调用系统控制台输出
  4. 实现了HTTP多线程下载
  5. mysql交叉连接后生成的记录总数_4.mysql数据库创建,表创建模等模板脚本,mysql_SQL99标准的连接查询(内连接,外连接,满外连接,交叉连接)_MySQL...
  6. python 输入华氏温度f_如何用 python编写华氏摄氏度的相互转换?
  7. URL、SRC、HREF知识整理
  8. python并发处理机制_Python并发编程—同步互斥
  9. 华为机试HJ87:密码强度等级
  10. jvm 内存溢出 Java heap space 调优解决过程
  11. 我们玩游戏,还是游戏玩我们……
  12. java 集合对象转map的几种方式(stream流)
  13. ai怎么渐变颜色_AI的渐变工具为什么如此难用?
  14. Spark未授权访问getshell
  15. 杜比介绍 杜比数位 Dolby
  16. 【计算机网络】PPP和PPPoE协议
  17. python3网络爬虫笔记-爬虫基础原理
  18. 历数PC发展史上的祖先们
  19. 温度传感器采集温度数据通过网关上传至ThingsBoard平台
  20. 苹果又魔改安卓?有人说,还不如看鸿蒙……

热门文章

  1. Quartz定时框架CronTrigger开发使用实例
  2. 用python玩转数据第四周答案_用Python玩转数据_章节答案
  3. const char *p,char const *p, char * const p之间的区别
  4. 记录前端浏览器常见错误SyntaxErro或GET http://xxx/xxx (Not Found)等
  5. 常用算法 之一 详解 MD5 实现(基于算法的官方原文档)及源码详细注释
  6. 操作系统原理:死锁的特征,预防,避免,恢复
  7. 常用API-3(System类、Math类、Arrays类、正则表达式)
  8. 单机版五子棋java功能_java实现单机版和网络对战版五子棋程序
  9. padding 不占宽高_不占地方的复式楼室内电梯,极致微型,节电省力颜值高
  10. envi导出jpg文件_保存技巧,完美解决PS导出文件过大的问题