访问xml数据的3种模式

基于树模型的 API
树模型 API 将 XML 文档呈现为由节点组成的树,这个树通常可以立即加载到内存中。最常用的 XML 树模型 API 是 W3C 文档对象模型 (DOM)。DOM 支持以编程方式读取、处理和修改 XML 文档。

以下示例使用 .NET Framework 中的 XmlDocument 类获取
items
元素中第一个
compact-disc
的艺术家姓名和标题。

using System;
using System.Xml;

public class Test{

public static void Main(string[] args){

XmlDocument doc = new XmlDocument();
doc.Load("test.xml");

XmlElement firstCD = (XmlElement) doc.DocumentElement.FirstChild;
XmlElement artist =
(XmlElement) firstCD.GetElementsByTagName("artist")[0];
XmlElement title =
(XmlElement) firstCD.GetElementsByTagName("title")[0]

Console.WriteLine("Artist={0}, Title={1}", artist.InnerText, title.InnerText);
}
}

基于游标的 API
XML 游标 API 就像在 XML 文档中移动的镜头,对准被定向的文档的各个方面。.NET Framework 中的 XPathNavigator 类就是一个 XML 游标 API。XML 游标 API 与树模型 API 相比,具有不必将整个文档加载到内存中的优势,这样便于对 XML 生成程序中按需生成文档的部分进行优化。

以下示例使用 .NET Framework 中的 XPathNavigator 类获取
items
元素中第一个
compact-disc
的艺术家姓名和标题。

using System;
using System.Xml;
using System.Xml.XPath;

public class Test{

public static void Main(string[] args){

XmlDocument doc = new XmlDocument();
doc.Load("test.xml");

XPathNavigator nav = doc.CreateNavigator();

nav.MoveToFirstChild(); //从根节点移至文档元素 (items)
nav.MoveToFirstChild(); //从 items 元素移至第一个 compact-disc 元素

//从 compact-disc 元素移至 artist 元素
nav.MoveToFirstChild();
nav.MoveToNext();
string artist = nav.Value;

//从 artist 元素移至 title 元素
nav.MoveToNext();
string title = nav.Value;

Console.WriteLine("Artist={0}, Title={1}", artist, title);
}
}

流式 API
使 用处理 XML 的流式 API 时,用户只需在内存中存储要处理的当前节点的上下文,即可处理 XML 文档。此类 API 可以处理大型的 XML 文件,而不会占用庞大的内容空间。用于 XML 处理的流式 API 主要有两种类型:基于推进的 XML 分析器和基于拉出的 XML 分析器。

基 于推进的分析器(如 SAX)的工作方式是在 XML 数据流中移动,并在遇到 XML 节点时将事件“推进”到已注册的事件处理程序(回调方法)。基于拉出的分析器(如 .NET Framework 中的 XmlReader 类)则在 XML 数据流中用作只向前的游标。

以下示例使用 .NET Framework 中的 XmlReader 类获取
items
元素中第一个
compact-disc
的艺术家姓名和标题。

using System;
using System.Xml;

public class Test{

public static void Main(string[] args){

string artist = null, title = null;
XmlTextReader reader = new XmlTextReader("test.xml");

reader.MoveToContent(); //move from root node to document element (items)

/* 保持读取,直至获得第一个 <artist> 元素 */
while(reader.Read()){

if((reader.NodeType == XmlNodeType.Element) && reader.Name.Equals("artist")){

artist = reader.ReadElementString();
title = reader.ReadElementString();
break;
}
}
Console.WriteLine("Artist={0}, Title={1}", artist, title);
}
}




















link.gif

using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlDocument doc = new XmlDocument();//建立文档对象
            try
            {
                doc.Load("../../myOrder.xml");//加载xml对象
                XmlNode root = doc.DocumentElement;//获取文档根节点
                XmlNode tempNode;
                if (root.HasChildNodes)
                {
                    tempNode = root.FirstChild;//根结点的第一个字节点
                }
                else
                {
                    tempNode = root;

                }
                while (tempNode != root)
                {
                    Console.Write(tempNode.Name);
                    tempNode = tempNode.FirstChild;//获取节点的字节点
                    //判断是否是文本节点
                    if (tempNode.GetType().Name == "XmlText")
                    {
                        Console.WriteLine(":" + tempNode.Value);
                        while (tempNode.NextSibling == null && tempNode != root)
                        {
                            tempNode = tempNode.ParentNode;
                        }
                        if (tempNode != root)
                            tempNode = tempNode.NextSibling;//获取下一个节点

                    }
                    else
                    {
                        Console.WriteLine();
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            Console.ReadLine();//辅助代码,用于保留控制台窗口
        }
    }
}





转自:http://www.cnblogs.com/xiangxiang/archive/2006/09/13/503499.html

转载于:https://www.cnblogs.com/Dragon-China/archive/2007/06/01/767160.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值