XDocument 获取包括第一行的声明(版本、编码)的所有节点
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 获取包括第一行的声明(版本、编码)的所有节点相关推荐
- asp.net gridview删除 获取到第一行第一列的单元格内容_VBA中的常用单元格引用方式...
VBA编程经常和"对象"打交道,其中最频繁的对象大概就是"单元格"了.(听说您还没有对象?那--我想你大概需要一份Excel,包邮988--) 今天我们就来聊一 ...
- bash shell sed 获取第一行_老司机给出的关于 shell 脚本的8个建议,必收!
这八个建议,来源于键者几年来编写 shell 脚本的一些经验和教训.事实上开始写的时候还不止这几条,后来思索再三,去掉几条无关痛痒的,最后剩下八条.毫不夸张地说,每条都是精挑细选的,虽然有几点算是老生 ...
- 三线表是什么?R语言使用table1包绘制(生成)三线表、使用单变量分列构建三线表、通过topclass参数自定义三线表表格的显示形式(显示为类似斑马线、并将所有列居中,包括包含行标签的第一列)
三线表是什么?R语言使用table1包绘制(生成)三线表.使用单变量分列构建三线表.通过topclass参数自定义三线表表格的显示形式(显示为类似斑马线.并将所有列居中,包括包含行标签的第一列) 目录
- C语言试题九十二之输入数据有多行,第一行是一个整数n,表示测试用例的个数,后面跟着n行 ,每行包括一个由字母和数字组成的字符串
1.题目 输入 输入数据有多行,第一行是一个整数n,表示测试用例的个数,后面跟着n行,每行包括一个由字母和数字组成的字符串 输出 对于妈给测试用例,输出该字符串中数值的个数,每个输出占一行 样式输 ...
- datatable中某一列最小值_Asp.net中获取DataTable选择第一行某一列值
数据源是一个DataTable,现在我们需要获取这个DataTable的第一行第一列的值. 先准备一个数据集,创建一个DataTable,并填充数据: source code: using Syste ...
- Android 学习之《第一行代码》第6章:adb调试:pemission denied以及模拟器不能获取root权限问题的解决
问题描述: <第一行代码>第六章用ADB工具打开数据库过程中,cd 命令直接报 permission denied,想着应该是权限不够,于是尝试输入su .sudo.su root.adb ...
- Epplus获取数据区域的第一行或最后一行
使用Epplus编辑表格文件时,有时需要知道表格中数据的第一行或最后一行,以便追加数据.此时可通过下列方法获取: //获得有数据的区域var lastAddress = worksheet.Dimen ...
- java获取excel文件第一行_java - 在Java中读取Excel文件,但第一行除外 - 堆栈内存溢出...
我正在尝试从使用xlsx文件的JasperReport模板自动创建报告,我用来从excel文件读取的方法是这样的: String[] columnNames = new String[]{" ...
- 给第一行单元格赋值WPS JS获取工作表的总行数WPS JS获取工作表的总行数
戳我,了解更多相关办公的小技巧 给第一行单元格赋值 1.在计算机中有一种ASCII编码,其中A在计算机中的表示的数字是65,a的ascii码是97,b的ascii码是98. 2.从A1到F1可以看到第 ...
最新文章
- 夏天和空调_您可以在今年夏天开始学习650项免费的在线编程和计算机科学课程...
- 在linux系统使用nginx部署静态网页
- C#在winform中调用系统控制台输出
- 实现了HTTP多线程下载
- mysql交叉连接后生成的记录总数_4.mysql数据库创建,表创建模等模板脚本,mysql_SQL99标准的连接查询(内连接,外连接,满外连接,交叉连接)_MySQL...
- python 输入华氏温度f_如何用 python编写华氏摄氏度的相互转换?
- URL、SRC、HREF知识整理
- python并发处理机制_Python并发编程—同步互斥
- 华为机试HJ87:密码强度等级
- jvm 内存溢出 Java heap space 调优解决过程
- 我们玩游戏,还是游戏玩我们……
- java 集合对象转map的几种方式(stream流)
- ai怎么渐变颜色_AI的渐变工具为什么如此难用?
- Spark未授权访问getshell
- 杜比介绍 杜比数位 Dolby
- 【计算机网络】PPP和PPPoE协议
- python3网络爬虫笔记-爬虫基础原理
- 历数PC发展史上的祖先们
- 温度传感器采集温度数据通过网关上传至ThingsBoard平台
- 苹果又魔改安卓?有人说,还不如看鸿蒙……
热门文章
- Quartz定时框架CronTrigger开发使用实例
- 用python玩转数据第四周答案_用Python玩转数据_章节答案
- const char *p,char const *p, char * const p之间的区别
- 记录前端浏览器常见错误SyntaxErro或GET http://xxx/xxx (Not Found)等
- 常用算法 之一 详解 MD5 实现(基于算法的官方原文档)及源码详细注释
- 操作系统原理:死锁的特征,预防,避免,恢复
- 常用API-3(System类、Math类、Arrays类、正则表达式)
- 单机版五子棋java功能_java实现单机版和网络对战版五子棋程序
- padding 不占宽高_不占地方的复式楼室内电梯,极致微型,节电省力颜值高
- envi导出jpg文件_保存技巧,完美解决PS导出文件过大的问题