使用c#来操作XML中的处理指令(PI)

 什么是处理指令?处理指令(Processing Instructions,PI)是用“<? ?>”包围的一种标签,用以描述特定应用程序信息。Xml文档可以包含多个针对不同应用程序的处理指令。处理指令由两部分组成,target和value。target的角色类似于“名称”,紧随target之后的字符串就是value,value可以包含多个标记。
<? target value ?>
那么Xml声明是不是处理指令呢?答案是肯定的,Xml声明是一个特殊的处理指令,它之所以特殊是因为它的value格式是预先定义好的。另外一个常见的处理指令示例是外部样式表。样式表处理指令也拥有预先定义好格式的value值,它由一些伪属性组成。为什么叫做“伪属性”,这是因为它的value值看上去像是几个正常的Xml属性,但事实上它们只是一个字符串而已。
<? xml-stylesheet href="standardstyle.css" title="Standard Stylesheet" type="text/css" ?>
然而处理指令value值的格式是开放的。处理指令并不是文档数据的一部分,Xml解析器并不会理会它的内容,而是直接将它传递给客户端应用程序。

微软Office套件中的InfoPath就是用了处理指令来指示Xml文件是否可以用InfoPath客户端来查看。
<? mso-application progid="InfoPath.Document" ?>
而另一个处理指令,mso-infoPathSolution,则告诉InfoPath解决方案模板的位置。该模板包含了布局Xml文件的布局转换信息、视图的架构信息已经数据源信息。

那么在c#应用程序中该如何操作包含处理指令的Xml文档呢?

我们该如何处理和读取Xml文档中已有的处理指令?首先,处理指令可以像文档中的其他节点一样被选出。XPath使用了谓词(predicate )processing-instruction()来测试该节点是不是一个处理指令。

在System.XML命名空间中,有一个XmlProcessingInstruction类。当你从Xml文档中选出了一个节点后,就可以把返回的XMLNode对象转换成这种类型,该类型提供了非常友好的接口来操作处理指令的value。想要读取它的value,只需要访问该对象的Value属性即可。

想要改变处理指令的值,也只需要将新值赋给该对象的Value属性。

想要在Xml文档中添加一个新的处理指令,可以使用XMLDocument类的CreateProcessingInstruction方法。然后再使用InsertBefore或InsertAfter方法来将这个XmlProcessingInstruction对象添加到Xml文档中。

想要从Xml文档中删除已有的处理指令,首先选出该处理指令的XmlNode对象,但不需要将其转换为XMLProcessingInstruction对象。然后使用XMLDocument类的RemoveChild方法就可以将其删除。

下面的代码包含了本文所提及的全部内容:
//  Xml文件路径 
string  strPath  =  “path” 

//  加载Xml文档内容 
XmlDocument doc  =   new  XmlDocument(); 
doc.XmlResolver 
=   null
doc.Load(strPath); 

//  显示Xml文档内容 
Console.WriteLine(doc.InnerXml.ToString().Replace( " >< " " >\r\n\n< " )); 
//  读取Xml文档的处理指令 
XmlProcessingInstruction pi  =  (XmlProcessingInstruction)doc.SelectSingleNode( " /processing-instruction(\ " mso - infoPathSolution\ " ) " ); 
//  显示处理指令的value 
Console.WriteLine(pi.Value); 

//  更新处理指令的value 
pi.Value  =   " updated value "

//  显示更新后的处理指令value 
Console.WriteLine(pi.Value); 

//  创建新的处理指令 
XmlProcessingInstruction piNew  =  doc.CreateProcessingInstruction( " new-pi " " my new processing instruction " ); 

//  将处理指令添加到文档中 
doc.InsertBefore(piNew, doc.ChildNodes[ 3 ]); 

//  删除处理指令 
XmlNode ndDel  =  doc.SelectSingleNode( " /processing-instruction(\ " mso - application\ " ) " ); 
doc.RemoveChild(ndDel); 

//  显示更改后的Xml文档 
Console.WriteLine(doc.InnerXml.ToString().Replace( " >< " " >\r\n\n< " ));

本为翻译自:http://aspalliance.com/515_Working_with_XML_Processing_Instructions_in_C.all
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值