tonyqus.cn

休养中..
随笔 - 202, 文章 - 1, 评论 - 1208, 引用 - 57
数据加载中……

XmlTextWriter学习笔记

原本想基于XmlDocument自己写一个Xml编写器,但却发觉状态维护实在麻烦。在阅读《Applied Xml Programming for Microsoft .Net》时,意外发现XmlTextWriter的优越性,于是决定直接使用它进行开发。

XmlWriter与XmlTextWriter的区别
一开始我认为既然XmlTextWriter可以用,那XmlWriter也一定可以用,当我写完下面的语句时,编译器报错。
XmlWriter doc=new XmlWriter();
原因很简单,XmlWriter是抽象类,自然不能直接实例化。看了书后才知道XmlTextWriter是XmlWriter接口的实现类,因此初始化语句改为
XmlWriter doc=new XmlTextWriter();

这样就对了。

常用函数说明
1. WriteStartDocument()
用于写Xml头声明,即<?xml version="1.0" encoding="utf-8">,如果使用该函数的重载函数WriteStartDocument(bool standalone),就可以设置声明的standalone属性,该属性表示该xml文档是否与其他文件独立,即是否需要单独声明节点。
2. WriteEndDocument()
该函数尽管不会向xml文件写任何文本,但必须在编写结束时调用,以结束写过程,它会清空XmlTextWriter中维护的所有堆栈和临时信息,类似于Dispose()函数。
3. WriteStartElement()
创建当前节点的一个子节点,通常使用WriteStartElement(string LocalName,string Value),其中LocalName表示节点名称,value表示节点的InnerText
如:WriteStartElement("address","Tian Jing Road");
生成的xml:<address>Tian Jing Road</address>
4. WriteEndElement()
一旦使用过一句WriteStartElement()就必须有对应的WriteEndElement(),当WriteEndElement被执行后,当前指向的节点就会转为父节点,如:
<shop>
    <address>Tian Jing Road</address>
</shop>
在执行WriteStartElement("address","Tian Jing Road")后,当前指向<address>节点,在WriteEndElement被执行后,当前节点指向<shop>节点
5. WriteStartAttribute()与WriteEndAttribute()
与节点创建函数用法相同
6. WriteAttributeString(string LocalName,string value)
该函数用于创建属性,与WriteStartAttribute()不同的是它不需要EndAttribute(),直接使用就可以了。
但要注意它与WriteStartAttribute生成的xml的不同之处,看下面的例子:

WriteStartElement("address"); 
WriteStartAttribute(
"state","California");
WriteEndAttribute();
WriteEndElement();

以上代码生成的xml:<address d1p1:state="" xmlns:d1p1="California" />

WriteStartElement("address"); 
WriteAttributeString(
"state","California");
WriteEndElement();

以上代码生成的xml: <address state="California" />

也就是说WriteAttributeString生成的是未处理的原始语句,而WriteStartAttribute()生成的是Xml Schema语句
7. WriteElementString(string LocalName, string Value)
与WriteAttributeString的用法相同,其中LocalName为节点名称,Value为节点的InnerText。
8. WriteString()与WriteRaw()的区别
    WriteString("More >")生成的Xml是More &gt
    WriteRaw("More >")生成的xml是More >
    也就是说WriteString会把敏感字符转换为转义字符,而WriteRaw()则是直接写入,不做任何处理
9. WriteCData()
    该函数是用来写用CData包裹的字符串,在字符串中有敏感字符时很有用
    WriteCData("More >")生成的Xml是<![CDATA [More >]] >
10.WriteFullEndElement()
    该函数用来写完整的结束标志,如<address></address>,
    writer.WriteStartElement("address", null);
    writer.WriteFullEndElement();


 
常用属性说明
1.Formatting属性的默认值为Formatting.None

2.XmlTextReader.Indentation属性,表示缩近字符的字符数,Formatting属性为Formatting.Indented时,才会生效
3.XmlTextReader.IndentChar才会生效,
IndentChar是缩近字符,一般使用’\t’,Formatting属性为Formatting.Indented时,才会生效
4.
QuoteChar属性表示封闭字符,默认为双引号

 

posted on 2005-01-26 08:24 Tony Qu 阅读(2674) 评论(7)  编辑 收藏 所属分类: .NET 1.1 技术

评论

#1楼    回复  引用    

好,我对xml也是一知半解的。有空也要好好学习这些基本的东西
2005-01-26 14:47 | myx [未注册用户]

#2楼    回复  引用  查看    

多谢分享
2005-02-04 12:48 | weko      

#3楼    回复  引用    

我想知道对于没有内容的标签 如何使其成对出现
WriteStartElement("address");

WriteEndElement();

我用这样的
输出的是
<address />

而我想生成的是<address></address>
以方便后期添加内容.
2005-05-05 14:59 | skyblue [未注册用户]

#4楼 [楼主]   回复  引用  查看    

如果你要生成的格式中允许多余空格的话,你可以试试这样写:
WriteStartElement("address"," "); //第二个参数是一个空格
WriteEndElement();
2005-05-05 20:49 | Tony Qu      

#5楼    回复  引用    

{而我想生成的是<address></address>
以方便后期添加内容.}
you can use WriteFullEndElement do it!!

// RefSemiComponent
writer.WriteStartElement("RefSemiComponent", null);
writer.WriteAttributeString("IMDS_ID", "");
writer.WriteAttributeString("Weight", "");
// end of RefSemiComponent
writer.WriteFullEndElement();
2005-06-01 14:14 | L.Ying [未注册用户]

#6楼    回复  引用    

<!DOCTYPE STOP_WORDS SYSTEM "stop_words.dtd"> 类似这样的用哪个方法?
2006-02-05 16:07 | gus [未注册用户]

#7楼    回复  引用    

谢谢提供,学到很多啊~~~~~~~~~~~~
2006-04-28 23:31 | islands [未注册用户]

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-04-30 08:35 编辑过


相关链接: