C#操作XML(一)

一、使用XML DOM的方式读取XML

本节要点:

  • 加载XML的几种方式
  • 读取没有Namespace的XML
  • 使用XPath进行过滤,选出需要的节点
  • 读取有Namespace的XML

XML DOM方式是最原始的一种操作XML的途径,从.Net Framework 1.0开始就开始支持DOM方式。

1. 如何用XML DOM的方式读取XML?

  要读取XML首先要加载XML,加载的方式有两种,一种是从流或类似Reader加载,另一种就是加载字符串。

  a. 从流或者Reader加载,Load方法有五个重载

XmlDocument doc = new XmlDocument();

doc.Load("D:\\Test.xml");
using (FileStream stream = File.OpenRead("D:\\Test.xml"))
{
      doc.Load(stream);
}
using (TextReader reader = File.OpenText("D:\\Test.xml"))
{
      doc.Load(reader);
}
using (XmlReader reader = XmlReader.Create("D:\\Test.xml"))
{
      doc.Load(reader);
}

  b. 从字符串加载

XmlDocument doc = new XmlDocument();
doc.LoadXml(@"<?xml version=""1.0"" encoding=""UTf-16""?>
<data>
    <item>abc</item>
    <item>123</item>
    <item>vwxyzh</item>
</data>");

2. 读取无namespace的XML

  XML已经准备好,下面就开始读取这个XML。

  a. 现在希望读取data节下面所有item的text:  

foreach (XmlElement item in doc.ChildNodes[1].ChildNodes)
{
    Console.WriteLine(item.InnerText);
}

  结果:

  abc

  123

  vwxyzh

  b. 使用XPath进行过滤

     上面的写法问题有很多,例如在data节点中有非item的节点,这样访问,也就被无差别的把非item项也写出来了。

     例如:  

<?xml version="1.0" encoding="UTf-8"?>
<data>
    <item>abc</item>
    <item>123</item>
    <other>[email protected]#</other>
    <item>vwxyzh</item>
</data>

    结果:

    abc

    123

    [email protected]#

    vwxyzh

    显然"[email protected]#"也被选择出来了,这不是我们所希望的,所以,改用XPath的方式访问:

foreach (XmlElement item in doc.SelectNodes("/data/item"))
{
    Console.WriteLine(item.InnerText);
}

    结果:other项被排除在外了

    abc

    123

    vwxyzh

3. 读取有namespace的XML

  和C#一样XML也有namespace,并且namespace在XML中的作用巨大。

  我们先来加载一个XML片段:

doc.LoadXml(@"<?xml version="1.0" encoding="UTf-8"?>
<v:data xmlns:v="urn:vwxyzh">
    <v:item>abc</v:item>
    <v:item>123</v:item>
    <v:other>[email protected]#</v:other>
    <v:item>vwxyzh</v:item>
    <v:item>2009/10/18</v:item>
</v:data>");

  这里我们准备了一个namespace—urn:vwxyzh,并缩写为v。

  现在按照原来的XPath执行以下程序,会发现没有任何一个元素被选中。为什么会这样?

  因为原来的"/data/item"中的data节是没有namespace的data,所以这个XPath根本定位不到任何节点。

  必须要修改部分代码才能达到我们的目的,怎么办呢?

  a. 先来看看SelectNodes方法有哪些重载吧:  

public XmlNodeList SelectNodes(string xpath);
public XmlNodeList SelectNodes(string xpath, XmlNamespaceManager nsmgr);

     第一个重载就是之前使用的那个;

     第二个重载,需要提供一个XmlNamespaceManager实例,一看名字就知道,这个实例是用来管理Xml的Namespace的。

   b. 再来查看一下XmlNamespaceManager这个类,可以发现创建这个实例需要一个类型为XmlNameTable的实例做参数,那么谁能提供XmlNameTable的实例呢?

  c. XmlDocument本身就提供了这个XmlNameTable:

  d. 修改代码:  

XmlNamespaceManager xnmgr = new XmlNamespaceManager(doc.NameTable);
xnmgr.AddNamespace("v", "urn:vwxyzh");
foreach (XmlElement item in doc.SelectNodes("/v:data/v:item", xnmgr))
{
    Console.WriteLine(item.InnerText);
}

    先创建一个XmlNamespaceManager的实例,然后使用AddNamespace方法,把"v"设置为"urn:vwxyzh"。然后修改XPath,把dat修改为v:data,item修改为v:item,这样就可以了。

     运行就可以看到结果为:

   abc

   123

vwxyzh

   2009/10/18

  

时间: 2024-11-13 10:17:12

C#操作XML(一)的相关文章

php操作xml小结

<?php #php操作xml,SimpleXMLElement类小结 header('Content-type:text/html;charset=utf-8;'); //1.构造函数 /* $xmlstring=<<<XML <?xml version="1.0" encoding="utf-8"?> <note  xmlns:b="http://www.w3school.com.cn/example/&quo

使用Dom4j操作XML数据

--------------siwuxie095 dom4j 是一个非常优秀的 Java XML 的 API, 用来读写 XML 文件 和操作 XML 数据 特点:性能优异.功能强大.极端易用 dom4j 的下载链接:http://www.dom4j.org/dom4j-1.6.1/ 将 dom4j-1.6.1.zip 解压一览: 工程名:TestDom4j 包名:com.siwuxie095.dom4j 类名:Test.java 打开资源管理器,在工程 TestDom4j 文件夹下,创建一个

dom4j操作xml对象

// 获取Documen对象 public static Document getDocument(String path) throws Exception{ // 解析器对象 SAXReader reader = new SAXReader(); // 解析 return reader.read(path); } // 回写(XMLWriter) public static void writeXml(Document document,String path) throws Excepti

转载:用Ant操作XML文件

1.14 用XMLTask操作XML(1) 本节作者:Brian Agnew 对于简单的文本搜索和替换操作,Ant的<replace>任务就够用了,但在现代Java框架中,用户更可能需要强大的XML操作能力来修改servlet描述符.Spring配置等. XMLTask是Ant外部任务,它提供了强大的XML编辑工具,主要用于在构建/部署过程中创建和修改XML文件. 使用XMLTask的好处如下? 与Ant的<replace>任务不同,XMLTask使用XPath提供识别XML文档各

简单操作XML

第一部分 什么是XML? XML, Extensible Markup Language ,可扩展标记语言,主要用途是描述和交换数据.它的一个用处是配置文件,用来保存数据库连接字符串.端口.IP.日志保存路径等参数.我们可以使用文本文件来保存文件,使用 key = value, key2 = value2 ,...... 的方式来保存数据.这样做的坏处是结构比较不规矩,读取起来也不方便,需要自行编写一长串的if / else 语句.为了解决这些问题,我们可以使用XML. XML定义了一组规则,即

C#操作XML增删改查

XML文件是一种常用的文件格式,不管是B/S还是C/S都随处可见XML的身影.Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具.XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,虽然XML占用的空间比二进制数据要占用更多的空间,但XML极其简单易于掌握和使用.微软也提供了一系列类库来倒帮助我们在应用程序中存储XML文件. “在程序中访问进而操作XML文件一般有两种模型,分别是使用DOM(文档对象模型)和流模型

delphi操作xml学习笔记 之一 入门必读

Delphi 对XML的支持---TXMLDocument类 Delphi7 支持对XML文档的操作,可以通过TXMLDocument类来实现对XML文档的读写.可以利用TXMLDocument把XML文档读到内存中,从而可以进行编辑.保存操作.TXMLDocument类是通过DOM(文档对象模型)接口来访问XML文档中的各个元素的.对于DOM接口的实现有多种方式,Delphi支持的方式有:1)微软的MSXML SDK,这种方式是通过COM对象来实现:2) Apache 的Xerces的实现方式

Delphi 操作 XML(一)

一.欢迎 本帮助文件提供从SimDesign BV的NativeXml组件的信息. 二.购买NativeXml! NativeXml现在是开源的,但支持是仅专门适用于购买NativeXml的客户. 您可以通过此链接购买NativeXml:http://www.simdesign.nl/xml.html 价格:29.95欧元 采购NativeXml的优势: 两年的通过电子邮件或特殊的"NativeXml Source"论坛支持,接收测试和修正,并从"NativeXml Sour

delphi 操作 XML (二)

在装有Win7 32位系统的台式机上 先卸载旧驱动,再重新安装. 对设备管理器里的U转串口设备从本地更新驱动,选择下图文件 系统弹出红色提示框(是否安装XXXX驱动),选择安装,随后该设备由无法启动变为工作正常. 在Win8 64位系统上 安装驱动后,出现下图情况,设备无法启动(错误代码10) 选择08年的驱动后,串口恢复正常. 总结 这些驱动有很多不兼容的,特别是在高级Windows版本或64位系统上,解决的思路就是多尝试安装各种版本,并根据串口状态调整安装策略. delphi 操作 XML

C#操作XML学习(一)

一.简单介绍 using System.Xml; //初始化一个xml实例 XmlDocument xml=new XmlDocument(); //导入指定xml文件 xml.Load(path); xml.Load(HttpContext.Current.Server.MapPath("~/file/bookstore.xml")); //指定一个节点 XmlNode root=xml.SelectSingleNode("/root"); //获取节点下所有直接