在VisualC#中使用XML指南之读取XML

在VisualC#中使用XML指南之读取XML,第1张

在VisualC#中使用XML指南之读取XML,第2张

至于XML,我相信你们都很了解,所以我不必浪费文字来描述它是什么。我认为XML将在未来的Web开发中大放异彩。XML是一种可扩展的标记语言,企业可以使用它制定一套自己的数据格式。数据按照这种格式在网络中传输,然后通过XSLT将数据转换成用户期望的样子,轻松解决数据格式不兼容的问题。用于互联网上的数据传输,我想,这才是XML最吸引我们程序员的地方!

我们今天的主题不是讨论XML的好处,而是讨论如何在C#中使用XML。我们先来看看用程序访问XML的一些基础理论知识。

两种访问模式:

一般在程序中访问和操作XML文件有两种模型,即使用DOM(文档对象模型)和stream模型。使用DOM的好处是允许编辑和更新XML文档,可以随机访问文档中的数据,可以使用XPath查询。但是DOM的缺点是需要一次性将整个文档加载到内存中,对于大文档会造成资源问题。流模型很好地解决了这个问题,因为它使用了流的概念来访问XML文件,也就是说,在任何时候内存中都只有当前节点,但它也有它的缺点。它是只读的,只能向前导航,不能在文档中向后导航。虽然各有利弊,但我们也可以在节目中利用二者,实现优劣互补。呵呵,这是题外话!今天主要讨论XML的读取,那么就详细讨论一下流程模型吧!

模型中的变化:

模型在XML文档中一次迭代一个节点,适合处理大型文档,内存消耗小空。流模型中有两种变体——“推”模型和“拉”模型。

推送模型也称为SAX。SAX是一个事件驱动的模型,也就是说,它每找到一个节点,就用push模型来触发一个事件,我们要为这些事件写一个处理程序,非常不灵活,也很麻烦。

基于“拉”模型的实现方案被用于。网。在遍历文档时,“拉”模型会将文档感兴趣的部分从阅读器中拉出,不引发事件,允许我们以编程方式访问文档,极大地提高了灵活性。在性能方面,“拉”模型可以有选择地处理节点,而SAX会在每次发现节点时通知客户端,因此,使用“拉”模型可以提高应用程序的整体效率。英寸NET中,“拉”模型是作为XmlReader类实现的。下面是这个类的继承结构:

今天我们来谈谈这个架构中的XmlTextReader类。这个类提供了读取Xml文件的功能。它可以验证文档是否是格式良好的。如果它不是一个格式良好的Xml文档,该类将在读取过程中抛出XmlException异常。您可以使用该类提供的一些方法来读取和过滤文档节点,并获取节点的名称和值。请记住:XmlTextReader是基于流模型的实现。打个不太恰当的比方,XML文件就像水源,一打开水就会流出来。如果流过,就不会流回。在任何时候,内存中都只有当前节点。可以使用XmlTextReader类的Read()方法读取下一个节点。好了,说到这里,我们来看一个例子。编程应该是实用的吧?先看运行效果再看代码!

1按钮遍历文档读取数据,2按钮获取节点类型,3按钮获取节点类型,4按钮过滤文档获取数据内容,5按钮获取属性节点,6按钮获取name 空,7按钮显示整个XML文档。为此我特意写了一个类来封装上面的函数。该类的代码如下:


// -。下面简单介绍一下这个类:
/
//属性:[/br
//listBox:设置这个属性是为了获取客户端控件以便显示读取文件的内容(这里是listBox控件)
//xmlPath:设置这个属性是为了获取一个明确的Xml。]///
//基本使用(重要参考):[/br
//系统。Xml:有常用的类,对封装在这个name 空中的Xml进行操作,在这个类中使用了XmlTextReader类[/br
//XmlTextReader:这个类提供Xml文件。它可以验证文档是否是格式良好的。如果不是格式良好的Xml文档//,该类将在读取过程中引发XmlException异常。该类提供的一些方法可用于读取文档节点。等等。并获取节点的名称和值
/
//boolxmltextreader . read():读取流中的下一个节点,再次调用最后一个节点时方法返回false
// xmlnodetype xmltextreader . nodetype:该属性返回当前节点的类型
//XmlNodeType。Element元素节点
//XmlNodeType的结束元素节点。end element
/XML node type . XML declaration文档的第一个节点
// XmlNodeType。text text node
//booxmltextreader . has attributes:当前节点是否有属性,True或false
// stringXMLTextReader . name:返回当前节点的名称
//String XmlTextReader . value:返回当前节点的值
//String XmlTextReader。LocalName:返回当前节点的本地名称
/String XmlTextReader。命名空间URI:返回当前节点名称之间的URI
/。XmlTextReader.prefix:返回当前节点的前缀
/bool xmltextreader . movetonextattribute():移动到当前节点的下一个属性
// -

命名空间XMLReading
{
使用System
使用系统。Xml
使用系统。Windows . Forms
使用系统。组件模型;

///< summary >
//XML文件读取器
//

public class XML reader:IDisposable
{
private string _ XML path;
private const string _ errMsg = "读取时出错";
private ListBox _ ListBox;
private XmlTextReader xmlTxtRd;

#region XmlReader的构造函数

public XML reader()
{
this。_xmlPath = string。空的;
这个。_ listBox = null
this . xmltxtrd = null;
}

///< summary >
//构造函数
//
//< param name = " _ XML path " > XML文件的绝对路径
//< param name = "。

public XmlReader(string _xmlPath,ListBox _ ListBox)
{
this。_ xmlPath = _ xmlPath
这个。_ listBox = _ listBox
this . xmltxtrd = null;
}

# end region
# region XML reader的资源释放方法

///< summary >
//清理使用此对象的所有资源。

///

public void Dispose()
{
this。Dispose(真);
GC。suppress finalize(this);
}

///< summary >
//释放该对象的实例变量
//
//< param name = " disposing " >

protected virtual void Dispose(bool disposing)
{
if(!disposing)
返回;
if (this.xmlTxtRd!= null)
{
this . xmltxtrd . close();
this . xmltxtrd = null;
}

如果(这个。_xmlPath!= null)
{
this。_ xmlPath = null
}
}

# regionxmlreader的# endregion
属性

///< summary >
//获取或设置列表框以显示XML
//

公共ListBox ListBox
{
get
{
return this。_ listBox
}
set
{
this。_listBox =值;
}
}

///< summary >
//获取或设置xml文件的绝对路径
//

公共字符串XML path
{
get
{
return this。_ xmlPath
}
set
{
this。_ xmlPath = value
}
}

#结束区域

///< summary >
//遍历Xml文件
//

public void each XML()
{
this。_列表框。items . Clear();
this . xmltxtrd = new XmlTextReader(this。_ XML path);

try
{
while(xmlTxtRd。Read())
{
this。_列表框。items . Add(this . xmltxtrd . value);
}
}
catch(XML exception exp)
{
throw new XML exception(_ errMsg+this。_xmlPath + exp。ToString());
}
最后
{
if (this.xmlTxtRd!= null)
this . xmltxtrd . close();
}
}

///< summary >
//用于读取Xml文件的节点类型
//

public void ReadXmlByNodeType()
{
this。_列表框。items . Clear();
this . xmltxtrd = new XmlTextReader(this。_ XML path);

try
{
while(xmlTxtRd。Read())
{
this。_列表框。items . Add(this . xmltxtrd . nodetype . tostring());
}
}
catch(XML exception exp)
{
throw new XML exception(_ errMsg+this。_xmlPath + exp。ToString());
}
最后
{
if (this.xmlTxtRd!= null)
this . xmltxtrd . close();
}
}

///< summary >
//根据节点类型过滤Xml文档
//
//< param name = " xmlntype " > Xml nodetype的节点类型数组

public void FilterByNodeType(XmlNodeType[]xmlNType)
{
this。_列表框。items . Clear();
this . xmltxtrd = new XmlTextReader(this。_ XML path);
try
{
while(xmlTxtRd。read())
{
for(int I = 0;i < xmlNType。长度;i++)
{
if (xmlTxtRd。NodeType = = xmlNType[I])
{
this。_列表框。Items.Add(xmlTxtRd。Name +"是类型"+ xmlTxtRd。NodeType . ToString());
}
}
}
}
catch(XML exception exp)
{
throw new XML exception(_ errMsg+this . XML path+exp。ToString());
}
最后
{
if (this.xmlTxtRd!= null)
this . xmltxtrd . close();
}
}

///< summary >
//读取Xml文件的所有文本节点值

///

public void ReadXmlTextValue()
{
this。_列表框。items . Clear();
this . xmltxtrd = new XmlTextReader(this。_ XML path);

try
{
while(xmlTxtRd。read())
{
if(xmlTxtRd。NodeType == XmlNodeType。Text)
{
这个。_列表框。Items.Add(xmlTxtRd。值);
}
}
}
catch(XML exception XML exp)
{
throw new XML exception(_ errMsg+this。_xmlPath + xmlExp。ToString());
}
最后
{
if (this.xmlTxtRd!= null)
this . xmltxtrd . close();
}
}

///< summary >
//读取Xml文件的属性
//

public void ReadXmlAttributes()
{
this。_列表框。items . Clear();
this . xmltxtrd = new XmlTextReader(this。_ XML path);

try
{
while(xmlTxtRd。read())
{
if(xmlTxtRd。NodeType == XmlNodeType。element)
{
if(xmlTxtRd。has attributes)
{
this。_列表框。items . Add(" The Element "+xmlTxtRd。名称+"具有"+ xmlTxtRd。AttributeCount +"属性");

这个。_列表框。Items.Add("属性为:");

while(xmlTxtRd。MoveToNextAttribute())
{
this。_列表框。Items.Add(xmlTxtRd。Name + " = " + xmlTxtRd。值);
}
}
否则
{
这个。_列表框。items . Add(" The Element "+xmlTxtRd。Name +“没有属性”);
}
这个。_列表框。items . Add(" ");
}
}
}
catch(XML exception XML exp)
{
throw new XML exception(_ errMsg+this。_xmlPath + xmlExp。ToString());
}
最后
{
if (this.xmlTxtRd!= null)
this . xmltxtrd . close();
}
}

///< summary >
//读取Xml文件名空
//

public void ReadXmlNamespace()
{
this。_列表框。items . Clear();
this . xmltxtrd = new XmlTextReader(this。_ XML path);
try
{
while(xmlTxtRd。read())
{
if(xmlTxtRd。NodeType == XmlNodeType。元素&& xmlTxtRd。前缀!= "")
{
这个。_列表框。Items.Add("前缀"+ xmlTxtRd。前缀+"与命名空间"+ xmlTxtRd "相关联。namespace uri);

这个。_列表框。Items.Add("具有本地名称的元素"+ xmlTxtRd。LocalName +"与“+”命名空间“+ xmlTxtRd”相关联。namespace uri);
}

if (xmlTxtRd。NodeType == XmlNodeType。元素&& xmlTxtRd。has attributes)
{
while(xmlTxtRd。MoveToNextAttribute())
{
if(xmlTxtRd。前缀!= "")
{
这个。_列表框。Items.Add("前缀"+ xmlTxtRd。前缀+"与命名空间"+ xmlTxtRd "相关联。namespace uri);

这个。_列表框。Items.Add("具有本地名称的属性"+ xmlTxtRd。LocalName +"与命名空间"+ xmlTxtRd "相关联。namespace uri);

}
}
}
}
}
catch(XML exception XML exp)
{
throw new XML exception(_ errMsg+this。_xmlPath + xmlExp。ToString());
}
最后
{
if (this.xmlTxtRd!= null)
this . xmltxtrd . close();
}
}

///< summary >
//读取整个Xml文件
//

public void read XML()
{
string attan dele = string。空的;
这个。_列表框。items . Clear();
this . xmltxtrd = new XmlTextReader(this。_ XML path);

try
{
while(xmlTxtRd。read())
{
if(xmlTxtRd。NodeType == XmlNodeType。XmlDeclaration)
this。_列表框。Items.Add(字符串。格式(" <?{0} {1} ?>“,xmlTxtRd。名称,xmlTxtRd。值));
else if (xmlTxtRd。NodeType == XmlNodeType。element)
{
attan dele = string。格式(" < {0} ",xmlTxtRd。姓名);
if (xmlTxtRd。has attributes)
{
while(xmlTxtRd。MoveToNextAttribute())
{
attan dele = attan dele+string。格式(“{ 0 } =“{ 1 }”),xmlTxtRd。名称,xmlTxtRd。值);
}
}

attAndEle = attAndEle。trim()+" > ";
这个。_列表框。items . Add(attan dele);
}
else if (xmlTxtRd。NodeType == XmlNodeType。EndElement)
this。_列表框。Items.Add(字符串。格式(" ",xmlTxtRd。姓名));
else if (xmlTxtRd。NodeType == XmlNodeType。正文)
这个。_列表框。Items.Add(xmlTxtRd。值);
}
}
catch(XML exception XML exp)
{
throw new XML exception(_ errMsg+this。_xmlPath + xmlExp。ToString());
}
最后
{
if (this.xmlTxtRd!= null)
this . xmltxtrd . close();
}
}
}
}

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 在VisualC#中使用XML指南之读取XML

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情