如何格式化字符串的xml?

【问】xml的标准形式是:

<Root>

<Name>John</Name>

<Age>16</Age>

</Root>

现在假如是一个字符串的形式——

<Root><Name>John</Name><Age>16</Age></Root>

请教如何对该字符串格式化,以便成为标准的xml文件格式?

【错误回答】

直接使用XmlDocument的LoadXml方法,然后输出保存到一个新的xml文档中。

【正解】

XmlDocument是存储以及对xml文件操作的一个.NET基本类型。除了对xml进行增删改查之外还可以直接对xml文件进行格式化操作。XmlDocument其中自带一个方法“WriteTo”,该方法需要一个继承TextWriter类的子类。针对xml文件,应该选用XmlTextWriter;XmlTextWriter又需要一个StringWriter流,而StringWriter需要一个Stream对象。恰巧StringBuilder是实现了Stream抽象类的子类。因此可以被使用。代码如下:

[C#]

XmlDocument doc = new XmlDocument();
doc.LoadXml("<Root><Name>John</Name><Age>16</Age></Root>");
StringBuilder sub = new StringBuilder();
StringWriter sw = new StringWriter(sub);
XmlTextWriter xw = new XmlTextWriter(sw);
xw.Formatting = Formatting.Indented;
doc.WriteTo(xw);

doc.Save("sim1.xml");

Console.WriteLine(sub);

[VB.NET]

Dim doc As New XmlDocument()
doc.LoadXml("<Root><Name>John</Name><Age>16</Age></Root>")
Dim [sub] As New StringBuilder()
Dim sw As New StringWriter([sub])
Dim xw As New XmlTextWriter(sw)
xw.Formatting = Formatting.Indented
doc.WriteTo(xw)
Console.WriteLine([sub])

值得注意的是:您必须设置XmlTextWriter的Formatting格式为Indented(锯齿,自动缩进的意思),否则仍然无法实现效果。

【总结】

1) 首先声明一个StringBuilder对象,作为目标源。

2) 其次声明一个StringWriter,作为连接该对象的“管道”(字符串“写入流”)。

3)然后声明一个XmlTextWriter,连接StringWriter(把StringWriter作为参数传入),并设置Formatting格式为Indented。

4)最后通过XmlDocument的WriteTo方法连接到XmlTextWriter即可。

【拓展】

关于“Stream”,“Reader/Writer”的“IO”探讨

众所周知,System.IO命名空间里边包括了大量支持文件、内存、网络、字符串等流写入(出)的类以及旗下方法。其主要从几个抽象类派生而成:

1)Stream:该类主要用作目标对象。一般地,微软这方面命名是:“目标对象”+Stream——

文件流:FileStream。

内存流:MemoryStream。

网络流:NetWorkStream(值得注意的是有一个类是位于System.NET.Sockets,专门用Socket或者TCP/IP等通讯发送信息时用)。

2) TextWriter:该类用于执行“写”操作,写入到指定某个继承Stream类的子类。这方面微软有对应的类:

文件、内存、网络流写入:StreamWriter。

字符串流写入:StringWriter(注意:其需要一个StringBuilder,而不是需要一个Stream子类对象作为参数)。

Xml文件流写入:XmlWriter和XmlTextWriter,前者自身是一个抽象类(不是继承TextWriter),单独也可以使用(使用Create方法,支持Stream和StringBuilder等),简单实现一些非常简单基本的xml读写操作(主要针对字符串格式的),后者继承了XmlWriter(构造函数参数支持对Stream和TextWriter子类进行写入),实现了其中所有的abstract方法,能够读写复杂的数据类型,如CData等)。同时还支持Formatting格式化,就像上面的例子。

不过有意思的在于:凡是以上类(以Writer结尾的),要写入到目标中的话必须显式调用Close或者Flush方法,否则这是驻留在内存中,不会真正写入到目标的。这也就是为什么很多时候程序没有错误,目标总是得不到的原因。

3) TextReader:该类用于执行“读”操作,读入到指定某个继承Stream类的子类。这方面微软有对应的类:

文件、内存、网络流读入:StreamReader。

字符串流读入:StringReader(注意:其需要一个string对象,而不是需要一个Stream子类对象作为参数)。

Xml文件流读入:XmlReader和XmlTextReader,前者自身是一个抽象类(不是继承TextReader),单独也可以使用(使用Create方法,支持TextReader和Stream等),简单实现一些非常简单基本的xml读写操作(主要针对字符串格式的),后者继承了XmlWriter,实现了其中所有的abstract方法,能够读写复杂的数据类型等)。

如何格式化字符串的xml?相关推荐

  1. xml字符串转xml对象,xml对象转json对象

    xml字符串转xml对象: function loadXml(str) {if (str == null) {return null;}var doc = str;try{doc = createXM ...

  2. C#格式化字符串,日期,时间,货币

    时间格式化 有时候我们要对时间进行转换,达到不同的显示效果  默认格式为:2005-6-6 14:33:34  如果要换成成200506,06-2005,2005-6-6或更多的该怎么办呢  我们要用 ...

  3. c语言解析xml字符串_Python XML解析

    Python XML解析 什么是XML? XML 指可扩展标记语言(eXtensible Markup Language). 你可以通过本站学习XML教程 XML 被设计用来传输和存储数据. XML是 ...

  4. 使用C++ ostringstream来格式化字符串输出

    在Linux C中,我们通常使用snprintf来格式化字符串输出,但是有一个问题,就是可能会频繁申请大的缓冲区,并且无法实现字符串的动态增加,比如你定义的字符缓存为100个字节,如果你格式化以后的内 ...

  5. 零基础入门学习Python(14)-格式化字符串

    什么是格式化字符串 格式化字符串就是按照统一的规格去输出一个字符串,如果规格不统一,就很可能造成误会 format()方法 接受位置参数和关键字参数两种参数 二者均传递到一个replacement的字 ...

  6. 字符串创建XML文档

    创建XML文档,方法与形式是多样的,下面Insus.NET再例举两种,可供参考. XmlDocument(namespace:System.Xml)在实例化之后,它有一个方法LoadXml(),可以把 ...

  7. WPF中Binding使用StringFormat格式化字符串方法

    原文:WPF中Binding使用StringFormat格式化字符串方法 货币格式 <TextBlock Text="{Binding Price, StringFormat={}{0 ...

  8. python 为什么用%格式化_Python中应该使用%还是format来格式化字符串?

    原标题:Python中应该使用%还是format来格式化字符串? Python中格式化字符串目前有两种阵营:%和format,我们应该选择哪种呢? 自从Python2.6引入了format这个格式化字 ...

  9. Linux下的格式化字符串漏洞利用姿势

    [转]http://www.cnblogs.com/Ox9A82/p/5429099.html linux最早的漏洞防护机制nx-stack刚刚出现后就有人想出了突破方法.那就是只有栈是不可执行,而除 ...

最新文章

  1. python中and与or的执行顺序-python 代码运行顺序问题?
  2. English sentences
  3. ue4 无限地图_UE4大地图(流关卡、无缝地图)
  4. http请求中的Query String Parameters、Form Data、Request Payload
  5. ArcGIS升级地理数据库
  6. SaltStack源码分析之:master端执行salt模块大致流程
  7. jquery颜色选择器
  8. 跨站式SQL脚本注入的技巧介绍
  9. Pandas库DataFrame的简单应用2
  10. Office 365 On MacOS 系列——安装 O365 其他组件
  11. 一、Java语言基础(3)_流程语句——控制循环结构语句
  12. Java调用网易163邮箱,发送邮件
  13. 闽教英语app 破解版 免费版
  14. 滚动轴承的代号表示方法
  15. Java第一天笔记01——jdk8的安装与环境变量的配置
  16. cad菜单栏快捷键_天正建筑菜单栏不见了怎么调出来
  17. Canvas绘制抽奖转盘
  18. 求负片灰度扩展幂律变换
  19. LifeSmart云起局域网直接控制向往背景音乐
  20. Elastic Search 深入搜索

热门文章

  1. 迷路在现代软件工程中的羔羊——略读邹欣老师《构建之法》及讲义有感(附上源代码管理软件以及CI/CD调研Demo)
  2. Attention中softmax的梯度消失及scaled原因
  3. 图形打印。(20分)
  4. 全局变量、静态全局变量、静态局部变量和普通局部变量的区别
  5. AI助手1.4版,需要自行准备API,供大家学习研究参考
  6. 机器学习综述与“Hello World”
  7. win7笔记本电脑如何禁用无线网络 电脑无线网卡禁用如何开启教程
  8. eclipse查看mysql_eclipse查看数据库
  9. android QMI机制---概论
  10. Spring boot security thymeleaf关于favicon.ico的404等问题