如何格式化字符串的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);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.Indenteddoc.WriteTo(xw)Console.WriteLine([sub])

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

【总结】

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

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

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

4)最后通过XmlDocumentWriteTo方法连接到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方法,能够读写复杂的数据类型等)。

时间: 2024-10-13 03:43:50

如何格式化字符串的xml?的相关文章

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

xml字符串转xml对象: function loadXml(str) { if (str == null) { return null; } var doc = str; try{ doc = createXMLDOM(); doc.async = false; doc.loadXML(str); }catch(e){ doc = $.parseXML(str); } return doc; } /** *xml对象转json对象 *xmlObj:xml对象 *nodename:节点路径('R

格式化字符串攻击原理及示例

一.类printf函数簇实现原理 类printf函数的最大的特点就是,在函数定义的时候无法知道函数实参的数目和类型. 对于这种情况,可以使用省略号指定参数表. 带有省略号的函数定义中,参数表分为两部分,前半部分是确定个数.确定类型的参数,第二部分就是省略号,代表数目和类型都不确定的参数表,省略号参数表中参数的个数和参数的类型是事先的约定计算出来的,每个实参的地址(指针)是根据确定参数表中最后一个实参的地址算出来的. 这里涉及到函数调用时的栈操作.函数栈的栈底是高地址,栈顶是底地址.在函数调用 时

编写高质量代码改善C#程序的157个建议——建议13: 为类型输出格式化字符串

建议13: 为类型输出格式化字符串 有两种方法可以为类型提供格式化的字符串输出.一种是意识到类型会产生格式化字符串输出,于是让类型继承接口IFormattable.这对类型来 说,是一种主动实现的方式,要求开发者可以预见类型在格式化方面的要求.更多的时候,类型的使用者需为类型自定义格式化器,这就是第二种方法,也是最灵活 多变的方法,可以根据需求的变化为类型提供多个格式化器.下面就来详细介绍这两种方法. 最简单的字符串输出是为类型重写ToString方法,如果没有为类型重写该方法,默认会调用Obj

Python格式化字符串

在编写程序的过程中,经常需要进行格式化输出,每次用每次查.干脆就在这里整理一下,以便索引. 格式化操作符(%) "%"是Python风格的字符串格式化操作符,非常类似C语言里的printf()函数的字符串格式化(C语言中也是使用%). 下面整理了一下Python中字符串格式化符合: 格式化符号 说明 %c 转换成字符(ASCII 码值,或者长度为一的字符串) %r 优先用repr()函数进行字符串转换 %s 优先用str()函数进行字符串转换 %d / %i 转成有符号十进制数 %u

格式化字符串攻击

什么是格式化字符串攻击? format string attack https://www.owasp.org/index.php/Format_string_attack 首先攻击发生在 格式化字符串所涉及的函数(例如 printf), 其次用户输入字符串提交后作为格式化字符串参数执行. 攻击者可以执行代码, 读取栈空间. 写栈空间. 导致进行段错误(segment fault),或者导致其他的威胁到计算机安全和稳定性的新的行为. 举例子 正确例子,其中 "Bob %%x %%x"

Javascript 解析字符串生成 XML DOM 对象。

Javascript 接收字符串生成 XML DOM 对象.实测对 Firefox .IE6 有效.可用于解析 ajax 的服务器响应结果,也可用于解析自定义字符串.?1. [代码]函数   ppt模版  /** * Parses DOM from XML text.<br /> *  * @author Typhoon.Free.Wolf * @version 2014-02-28_15-51 * @param blDebugFlag *      - Debug flag: true, f

js解析xml字符串或xml文件,将其转换为xml对象

注:判断是否是ie浏览器和非ie浏览器的方法有多种,在此只介绍用例中的方法: 1.解析xml字符串,得到xml对象的方式: function createXml(str){ if(document.all){//IE浏览器     var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");        xmlDoc.async = false;     xmlDoc.loadXML(str);     return xmlDoc; } el

使用DateTime.Now.ToString("yyyy/MM/dd/")格式化字符串

在一次项目中,偶然发现,把项目移到另一点电脑时 通过DateTime.Now.ToString("yyyy/MM/dd/")格式化字符串时,其字符串格式应为:yyyy-MM-dd 格式化后没有体现出应有的效果! 其原因是:系统时间设置的格式问题 如图: 别人电脑的格式为: 后面把代码改为了直接获取年月日拼接! 如果需要固定格式,可通过正则表达式实现! 使用DateTime.Now.ToString("yyyy/MM/dd/")格式化字符串,布布扣,bubuko.co

iOS 获取当前时间格式化字符串

iOS 获取当前时间格式化字符串 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. // 获取系统当前时间 NSDate * date = [NSDate date]; NSDateFormatt