XDocument 获取包括第一行的声明(版本、编码)的所有节点
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 获取包括第一行的声明(版本、编码)的所有节点的更多相关文章
- 获取DataTable选择第一行某一列值
数据源是一个DataTable,现在我们需要获取这个DataTable的第一行第一列的值.先准备一个数据集,创建一个DataTable,并填充数据: source code: using System ...
- python声明文件编码,必须在文件的第一行或第二行
#coding=utf-8和# -*- coding: utf-8 -*-的作用 – 指定文件编码类型 注意的两点: 1.声明必须在文件的第一行或第二行: 2.coding后面必须紧跟冒号或等号,#c ...
- 《第一行代码——Android》
<第一行代码——Android> 基本信息 作者: 郭霖 丛书名: 图灵原创 出版社:人民邮电出版社 ISBN:9787115362865 上架时间:2014-7-14 出版日期:2014 ...
- Kotlin实现《第一行代码》案例“酷欧天气”
看过<第一行代码>的朋友应该知道“酷欧天气”,作者郭神用整整一章的内容来讲述其从无到有的过程. 最近正好看完该书的第二版(也有人称“第二行代码”),尝试着将项目中的Java代码用Kotli ...
- 20172327 2018-2019-1 《第一行代码Android》第一章学习总结
学号 2018-2019-1 <第一行代码Android>第一章学习总结 教材学习内容总结 - Android系统架构: 1.Linux内核层 Android系统是基于Linux内核的,这 ...
- HTML5 & CSS3初学者指南(1) – 编写第一行代码
介绍 网络时代已经到来.现在对人们来说,每天上网冲浪已经成为一种最为常见的行为. 在网页浏览器中输入一段文本地址,就像http://www.codeproject.com,等待一下,网页就加载到浏览器 ...
- Android Studio 单刷《第一行代码》系列 02 —— 日志工具 LogCat
前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...
- 《代码的第一行——Android》封面诞生
<代码的第一行--Android>已经上市近一个月,现在的情况是相当不错的销售,也特别感谢众多朋友的支持. 其实一本好书,假设你想卖.除了给予外力所要求的内容.封面设计是至关重要的,这本书 ...
- 用kotlin方式打开《第一行代码:Android》
参考:<第一行代码:Android>第2版--郭霖 注1:本文为原创,例子可参考郭前辈著作:<第一行代码:Android> 注2:本文不赘述android开发的基本理论,不介绍 ...
随机推荐
- 杭电ACM题目分类
基础题: 1000.1001.1004.1005.1008.1012.1013.1014.1017.1019.1021.1028.1029.1032.1037.1040.1048.1056.1058. ...
- Java Collection框架详解
引用自:http://blog.sina.com.cn/s/blog_6d6f5d7d0100s9nu.html 经常会看到程序中使用了记录集,常用的有Collection.HashMap.HashS ...
- P4 前端编译器p4c-bm、后端编译器bmv2命令安装 make error问题
参考:Github 安装p4c-bm: sudo pip install -r requirements.txt sudo pip install -r requirements_v1_1.txt / ...
- Javacard 解释器怎样在API类库中找到源文件调用的类、方法或者静态域?
申明:本篇非本人原创,是在阅读各种论文文献之后,对论文文献的一种梳理. 主要参考文献为: ------------------------------------------------------- ...
- IHttpModule
随便写一个类继承IHttpModule 实现IHttpModule中的两个方法 Init() Dispose() public void Init(HttpApplication context) { ...
- ROW_NUMBER
16:23 2015/4/16 删除重复数据,连续被两位同事问到完全相同的重复记录如何删除只保留一条 create table del_samerecords (id )) go insert int ...
- Python之路-python(常用模块学习)
模块介绍 time &datetime模块 random os sys shutil shelve xml处理 yaml处理 configparser hashlib re正则表达式 1.模块 ...
- LUA脚本调用C场景,使用C API访问脚本构造的表
LUA调用C lua解析中集成了一些系统服务, 故脚本中可以访问系统资源, 例如, lua脚本可以调用文件系统接口, 可以调用数学库, 但是总存在一些lua脚本中访问不到的系统服务或者扩展功能, 如果 ...
- Cross-site Scripting (XSS) 阅读笔记
本文源自 https://www.owasp.org/index.php/Cross-site_Scripting_%28XSS%29 通过阅读和翻译,并按照自己的理解,整理成如下文档. 概述 XSS ...
- 字节流与字符流(FileInputStream类和FileOutputStream类)
FileInputStream类和FileOutputStream类中,第一个类的源端和第二个类的目的端都是磁盘文件,它们的构造方法允许通过文件的路径名来构造相应的流.例如: FileInputSte ...