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开发的基本理论,不介绍 ...
随机推荐
- 【应用笔记】【AN004】VB环境下基于RS-485的4-20mA电流采集
版本:第一版作者:周新稳 杨帅 日期:20160226 =========================== 本资料高清PDF 下载: http://pan.baidu.com/s/1c1uuhLQ ...
- A trip through the Graphics Pipeline 2011_09_Pixel processing – “join phase”
Welcome back! This post deals with the second half of pixel processing, the “join phase”. The pre ...
- rsync组合inotify-tools完成实时同步[转]
一. 什么是inotify inotify是一种强大的.细粒度的.异步的文件系统事件监控机制,Linux内核从2.6.13开始引入,允许监控程序打开一个独立文件描述符,并针对事件集监控一个或者多个文件 ...
- request
social.Favorites.AddFavorite=function(angel) { a = $.extend(true, { type: "POST", url: &qu ...
- 文档生成工具 appledoc
参考文章 1.安装: $ git clone git://github.com/tomaz/appledoc.git $ cd appledoc $ sudo sh install-appledoc. ...
- 【五子棋AI循序渐进】关于VCT,VCF的思考和核心代码
前面几篇发布了一些有关五子棋的基本算法,其中有一些BUG也有很多值得再次思考的问题,在框架和效果上基本达到了一个简单的AI的水平,当然,我也是初学并没有掌握太多的高级技术.对于这个程序现在还在优化当中 ...
- jqxGrid 绑定格式化
var cellsrenderer = function(row, columnfield, value, defaulthtml, columnproperties) { ) || (row == ...
- ECSHOP 用户中心 我的订单前台显视订单每张商品图片及收货人
先在网站根目录打开文件 includes/lib_transaction.php 查找代码 $sql = "SELECT order_id, order_sn, order_status, ...
- linux下对date和timestamp的互转
1. date 到 timestamp: $ date -d '2009-12-01 23:20' +%s 12596808002. timestamp 到 date$ date -d '1970-0 ...
- 安卓和ios的lineheight的不一样如何解决?
lineheight在pc端上显示很正常,但是在手机就很不同,在iphone6上,设置了lineheight,但是文本上面多了几像素,如果你设置lineheight在35px一下的按钮(用span做的 ...