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

XDocument doc = new XDocument(
new XDeclaration("1.0","UTF-8",null),
new XElement("Persons",
new XElement("Person",
new XAttribute("id",""),
new XElement("Name","张三"),
new XElement("Age",)
)
)
);
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

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

  1. 获取DataTable选择第一行某一列值

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

  2. python声明文件编码,必须在文件的第一行或第二行

    #coding=utf-8和# -*- coding: utf-8 -*-的作用 – 指定文件编码类型 注意的两点: 1.声明必须在文件的第一行或第二行: 2.coding后面必须紧跟冒号或等号,#c ...

  3. 《第一行代码——Android》

    <第一行代码——Android> 基本信息 作者: 郭霖 丛书名: 图灵原创 出版社:人民邮电出版社 ISBN:9787115362865 上架时间:2014-7-14 出版日期:2014 ...

  4. Kotlin实现《第一行代码》案例“酷欧天气”

    看过<第一行代码>的朋友应该知道“酷欧天气”,作者郭神用整整一章的内容来讲述其从无到有的过程. 最近正好看完该书的第二版(也有人称“第二行代码”),尝试着将项目中的Java代码用Kotli ...

  5. 20172327 2018-2019-1 《第一行代码Android》第一章学习总结

    学号 2018-2019-1 <第一行代码Android>第一章学习总结 教材学习内容总结 - Android系统架构: 1.Linux内核层 Android系统是基于Linux内核的,这 ...

  6. HTML5 & CSS3初学者指南(1) – 编写第一行代码

    介绍 网络时代已经到来.现在对人们来说,每天上网冲浪已经成为一种最为常见的行为. 在网页浏览器中输入一段文本地址,就像http://www.codeproject.com,等待一下,网页就加载到浏览器 ...

  7. Android Studio 单刷《第一行代码》系列 02 —— 日志工具 LogCat

    前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...

  8. 《代码的第一行——Android》封面诞生

    <代码的第一行--Android>已经上市近一个月,现在的情况是相当不错的销售,也特别感谢众多朋友的支持. 其实一本好书,假设你想卖.除了给予外力所要求的内容.封面设计是至关重要的,这本书 ...

  9. 用kotlin方式打开《第一行代码:Android》

    参考:<第一行代码:Android>第2版--郭霖 注1:本文为原创,例子可参考郭前辈著作:<第一行代码:Android> 注2:本文不赘述android开发的基本理论,不介绍 ...

随机推荐

  1. Unity学习疑问记录之隐藏与显示物体

    Unity3D中隐藏与显示物体的一些操作 http://unity3d.9tech.cn/news/2013/0930/33019.html

  2. 临床试验中PI、CI、SI、COI是指哪些人?

    今天为大家介绍的是临床试验的研究者的类型.临床试验的研究者是指在试验所在地负责实施临床试验的人员. 如果一项试验在试验场所由一组人员实施,研究者则为该组人员的负责人或领导者,也称之为主要研究者(Pri ...

  3. HDU 1264 Counting Squares(线段树求面积的并)

    Counting Squares Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  4. angularJs模糊查询

    html代码 <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <tit ...

  5. 解决Sublime Text 3 Package Control 问题

    我使用的环境是 Mac OS X 10.11.5. 安装Packet Control之后,尝试安装插件,出现如下问题: There are no packages available for inst ...

  6. 浏览器中Javascript的加载和执行

    在刚学习Javascript时曾对该问题在小组内做个一次StudyReport,发现其中的基础还是值得分析的. 从标题分析,可以加个Javascript的加载和执行分为两个阶段:加载.执行.而加载即浏 ...

  7. Day2(2016/1/22)——Testing

    Activity Button,Toast,Finish 显式intent 隐式明天再看…… 感觉要先补一补java……

  8. iOS沙盒目录

    出于安全考虑,iOS系统的沙盒机制规定每个应用都只能访问当前沙盒目录下面的文件(也有例外,比如系统通讯录能在用户授权的情况下被第三方应用访问),这个规则把iOS系统的封闭性展现的淋漓尽致. 一.沙盒中 ...

  9. Android Studio 开发环境设置

    修改字体(File=>Settings 按下如所图设计字体) 显示行号.空格 用 制表符 代替 空格 显示 最终代码显示如下图 格式化代码 使用 Ctrl+Alt+L

  10. Did not find handler method for springMVC资源文件扫描不到---关于spring的那些坑

    今天将项目的spring版本升级到4.2.5版本后,登录首页发现资源文件全部访问不到,页面彻底挂掉: 查找原因,后来又查找spring的更新文档后,才确认下来原来是mvc-dispatcher-ser ...