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. 【iCore3 双核心板_FPGA】实验十八:基于单口RAM的ARM+FPGA数据存取实验

    实验指导书及代码包下载: http://pan.baidu.com/s/1i58Ssvz iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  2. A trip through the Graphics Pipeline 2011_07_Z/Stencil processing, 3 different ways

    In this installment, I’ll be talking about the (early) Z pipeline and how it interacts with rasteriz ...

  3. java基础学习总结——基础语法2

    一.语句

  4. 如何在Rails中执行Get/Post/Put请求

    require 'open-uri' require 'json' require 'net/http' class CoupleController < ApplicationControll ...

  5. Android MP3录音实现

    给APP做语音功能,必须考虑到IOS和Android平台的通用性.wav录音质量高,文件太大,AAC和AMR格式在IOS平台却不支持,所以采用libmp3lame把AudioRecord音频流直接转换 ...

  6. jquery on()方法绑定多个选择器,多个事件

    on(events,[selector],[data],fn) •events:一个或多个用空格分隔的事件类型和可选的命名空间,如"click"或"keydown.myP ...

  7. 存储过程:当基站ID大于1000的时候,把ID通过存储过程插入表,然后处理

    不推荐这么弄,没办法,项目逼到这了,以后尽量避免这样的需求发生! CREATE OR REPLACE PROCEDURE insert_tempStation_proc(v_instr in clob ...

  8. iOS解析JSON字符串报错Error Domain=NSCocoaErrorDomain Code=3840 "Invalid escape sequence around character 586."

    将服务器返回的JSON string转化成字典时报错: Error Domain=NSCocoaErrorDomain Code=3840 "Invalid escape sequence ...

  9. Cross-Site Scripting(XSS)的类型

    本文源自: https://www.owasp.org/index.php/Types_of_Cross-Site_Scripting 在原文理解上翻译为中文. 背景 本文描述多种不同类型的XSS攻击 ...

  10. c#与.net的简介

    c语言诞生于上世纪60年代,后来诞生了面向对象的c++,后来出现看更为精简的java,微软之后又出了c#语言.早期的c#语言和java语言类似.经过长足的发展,c#变得越来越完美. 面向对象 简单,安 ...