当前位置:  编程技术>.net/c#/asp.net

c# 解析XML文件的方法总结

    来源: 互联网  发布时间:2014-08-30

    本文导语:   “推”模型也就是常说的SAX,SAX是一种靠事件驱动的模型。  它每发现一个节点就用“推”模型引发一个事件,而我们必须编写这些事件的处理程序,很麻烦。 .NET中使用的是基于“拉”模型的实现方案。 “拉”模型在遍历...

 “推”模型也就是常说的SAX,SAX是一种靠事件驱动的模型。
 它每发现一个节点就用“推”模型引发一个事件,而我们必须编写这些事件的处理程序,很麻烦。

.NET中使用的是基于“拉”模型的实现方案。 “拉”模型在遍历文档时会把感兴趣的文档部分从读取器中拉出,不需要引发事件,允许我们以编程的方式访问文档,这大大的提高了灵活性,“拉”模型可以选择性的处理节点。在.NET中,“拉”模型通过XML阅读器(XMLTextReader类)来实现的。该类提供Xml文件读取的功能,它可以验证文档是否格式良好,如果不是格式良好的Xml文档,该类在读取过程中将会抛出XmlException异常。任何时候在内存中只有当前节点,但它是只读的,向前的,不能在文档中执行向后导航操作。

DOM的好处在于它允许编辑和更新XML文档,可以随机访问文档中的数据,可以使用XPath查询。但是,DOM的缺点在于它需要一次性的加载整个文档到内存中,对于大型的文档,这会造成资源问题。在.NET中使用XML DOM分析器(XMLDocument)实现DOM模型。

因此,.NET Framework完全支持XML DOM模式,但它不支持SAX模式。.NET Framework支持两种不同的分析模式:XML DOM分析器(XMLDocument类)和XML阅读器(XMLTextReader类),不支持SAX分析器, 但这并不意味着它没有提供类似SAX分析器的功能。通过XML阅读器可以将SAX的所有的功能很容易的实现及更有效的运用。

我们一般选用xpath的方式来解析xml文档。
这主要是因为:
1,文件大小。要处理的文件不大,一般都在几百K到1M。
2,XPath的灵活性。不需要获取文档的全部数据,只需要获取大部分想要的数据。
3,学习代价低。符合一般的思维习惯,通过Path获取结果。

通过XPath的方式解析xml文档,需要先加载文档,然后再读取想要的节点值。

xml文档
protected XmlDocument doc = null;
xml文档的根元素(节点)
protected XmlElement root = null;
xml文档的名空间管理器
protected XmlNamespaceManager nsmgr = null;
加载文档:
 

代码示例:
protected void LoadXmlFile(FileInfo xmlFile)
 {
     if (xmlFile == null || !xmlFile.Exists)
     {
  throw new FileNotFoundException(string.Format("要解析的文件不存在{0}。",xmlFile.FullName));
     }
     //加载文件
     this.doc = new XmlDocument();
     doc.Load(xmlFile.FullName);
     //准备读取文件
     root = doc.DocumentElement;
     string nameSpace = root.NamespaceURI;
     nsmgr = new XmlNamespaceManager(doc.NameTable);
     nsmgr.AddNamespace("ns", nameSpace);
 }
 

注意:
这两行是取得xml文档的名空间
 

代码示例:
root = doc.DocumentElement;
string nameSpace = root.NamespaceURI;

这两行是建立xml文档的名空间管理器
 

代码示例:
nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("ns", nameSpace);

如果你的xml文档有名空间,则这部分的代码是必不可少的。

读取文档节点值:
这里两个传入参数prefixPath是节点的上级节点路径,xRelativePath是要读取的节点名称。

另外,变量XmlFileInfo是要加载的xml文件。
 

代码示例:
protected string GetNodeValue(string prefixPath, string xRelativePath)
 {
     if (doc == null)
     {
  LoadXmlFile(XmlFileInfo);
     }
     string xPath = string.Empty;
     if (!string.IsNullOrEmpty(xRelativePath))
     {
  if (!string.IsNullOrEmpty(prefixPath))
  {
      xPath = prefixPath + xRelativePath;
  }
  else
  {
      xPath = xRelativePath;
  }
     }
     xPath = xPath.Replace("/", "/ns:");
     XmlNode node = root.SelectSingleNode(xPath, nsmgr);
     if (node == null)
     {
  return null;
     }
     return node.InnerXml;
 }

为什么要设置两个参数prefixPath和xRelativePath呢,只是为了自己觉得方便,也可以在方法外确定了这个XPath,在方法中只设置一个传入参数,效果是一样的。

注意这一行:
xPath = xPath.Replace("/", "/ns:");
如果你的xml文档带名空间,则这行是比不可少的,否则会出现找不到节点,无法解析的情况。

这里还有一个不得不说的问题,就是关于XPath的。
对于这样一个xml文档,要查找第一个节点下的学生的Name时(ID=01),其XPath应该是"/ns:Root/ns:Students/ns:Student[1]/ns:Name"。xml对于重复的节点名称,是按照顺序1,2,3...的方式遍历的,也就是说如果要找第N个Student节点的下的节点之,那么应使用Student[N]的标识方式。 
 

代码示例:



1234



01Name01


02Name02



 

当然,这里也可以获取节点属性的值,查找满足特定值的节点等等,这些和上面获取节点值的过程是类似的。

有关c#解析xml文件的内容介绍完了,希望对大家有所帮助。


    
 
 

您可能感兴趣的文章:

  • C#解析JSON实例
  • 解析C#中#region与#if的作用
  • C# DES加密算法中向量的作用详细解析
  • C#中FormClosing与FormClosed的区别详细解析
  • c#中switch case的用法实例解析
  • C#枚举类型与结构类型实例解析
  • js substr,substring与java substring和C# substring的区别解析
  • C#类的创建与初始化实例解析
  • c#使用htmlagilitypack解析html格式字符串
  • C#的WebBrowser操作frame实例解析
  • 解析C#中如何把控件的边框角画为圆弧
  • 解析c#显示友好时间的实现代码
  • C#中out与ref的区别实例解析
  • C#事务处理(Execute Transaction)实例解析
  • c#使用nsoup解析html乱码解决方法分享 nsoup教程
  • 解析C#彩色图像灰度化算法的实现代码详解
  • Visual C#类的定义及实现方法实例解析
  • C#中私有构造函数的特点和用途实例解析
  • 解析c#操作excel后关闭excel.exe的方法
  • C#委托所蕴含的函数指针概念详细解析
  • 解析Mysql备份与恢复简单总结与tee命令的使用介绍
  • java对XML文件的解析、节点的增加、删除操作总结
  • java解析xml常用的几种方式总结
  • 解析SQLite中的常见问题与总结详解
  • 解析ActiveMQ的使用说明总结
  • SQL语句的各个关键字的解析过程详细总结
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • windows下tinyxml.dll下载安装使用(c++解析XML库)
  • 请教redhat9下什么命令执行arp解析和逆向arp解析
  • 使用libpcap读取tcpdump抓取的文件并解析c代码实例
  • 如何用libxml2 默认解析器解析HTML文件
  • 基于Python的Html/xml解析库Beautiful Soup 4.2.1发布
  • linux能否成为动态域名解析客户端的动态域名解析服务器?
  • html中<radio>单选按钮控件标签用法解析及如何设置默认选中
  • 配置DNS服务器后,服务器可解析,客户端不能解析。求解
  • Python下Html/xml解析库Beautiful Soup快速入门教程
  • 为什么我在使用nslookup命令的时候,正向解析(域名-》ip)没有问题,反向解析(ip-》域名)怎么查不到呢?
  • 基于Python的html解析库:pyquery最新版主页及pyquery下载
  • 服务器本机能解析域名,其它机子都解析不到,能ping通dns服务器地址,是什么问题?//
  • python下xml解析库lxml最新版下载安装以及代码示例
  • 我有一个DNS服务器,既要解析自己局域网里IP,有要解析外网上的IP,如www.163.com,我该如何设置呢
  • python对XML的解析方法(SAX,DOM,ElementTree)介绍
  • 请问怎样手工的解析XML文件啊.( 不借助任何的xml解析器)急!!!
  • php通过pack和unpack函数实现对二进制数据封装及解析
  • 通过shell解析文件,并根据解析内容生成新的文件。
  • html中<checkbox>标签用法解析及如何设置checkbox复选框的默认选中状态
  • java 公式解析 表达式解析 expression-analyzer
  • html中<select>标签用法解析及如何设置select的默认选中状态
  • 请问各位:我用SUN公司的JAXP开发包解析XML文档,可不知道对XML解析后如何将结果写回文件中。请各位熟悉Java和XML的高手帮忙。


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3