xml解析-临时

参考:http://www.cnblogs.com/zhangyf/archive/2009/06/03/1495459.html

 

 

 

 

通常有三种方式:DOM,SAX,PULL

先来看看解析xml文件的方法都有哪些吧,本段文字来自网络,可以帮助大家对这个问题有个概要的了解。

在程序中访问并操作XML文件一般有两种模型:流模型和DOM(文档对象模型)。流模型中有两种变体——“模型和模型。 

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

.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 文件大小。要处理的文件不大,一般都在几百K1M

2,  XPath的灵活性。不需要获取文档的全部数据,只需要获取大部分想要的数据。

3,  学习代价低。符合一般的思维习惯,通过Path获取结果。

 

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

xml文档

protected XmlDocument doc = null;

xml文档的根元素(节点)

protected XmlElement root = null;

 xml文档的名空间管理器 

protected XmlNamespaceManager nsmgr = null;

接下来就是加载文档了

 

 

DOM方式

1.先定义个类 XmlDocument xml = new XmlDocument();

  xml.LoadXml(strXML);//strXML你要解析的XML

  string strKey=//student/name”;//定义你要取得字段的Key,也就是xml层关系

2.取得XmlNodeList

 XmlNodeList list=xml.DocumentElement.SelectNodes(strKey);

 再循环XmlNodeList 的每个节点(XmlNode类)

 取得XmlNode类的InnerText值,也许就是你要的值,如果不是的话可以取得XmlNode.ChildNodes

 顺序就是这样。

 如果层比较深的话,也可以嵌套的定义XmlDocumentLoadXml(ChildNodes[index].OuterXml),继续解析就是了。

如果不懂得到XmlNodeList,监视下这个,看看他的结构就是了。

 

XmlDocument doc = new XmlDocument();
doc.load(filepath);
XmlNode root = doc.SelectSingleNode("age"); //
根节点
root.InnerText
就是2022

XmlDocument doc = new XmlDocument();
doc.load(filepath);
第一种方法
XmlNode root = doc.SelectSingleNode("student"); //
根节点
root.chileren[i]
就是节点(student)下的第i个子节点。
要想取第i个子节点的值,直接root.chileren[i].InnerText就行

第二种方法
XmlNodeList root = doc.SelectNodes("student");
root
就是节点(student)下所有子节点的集合。
要想取第i个子节点的值
forearch
XmlNode xn in root
{
  xn.InnerText
就是子节点的值
}

操作XML的类:
 
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
namespace XMLTest
{
    public class CommXml
    {
        public XmlDocument xmlDoc = new XmlDocument();
        public void getXmlDoc(string strXml)
        {
            xmlDoc.LoadXml(strXml);
        }
 
        public CommXml(string strXml)
        {
            xmlDoc.LoadXml(strXml);
 
        }
 
        /// <summary>
        /// 设置节点值
        /// </summary>
        /// <param name="strNode">节点名称</param>
        /// <param name="strValue">节点值</param>
        public void setNodeValue(string strNode, string strValue)
        {
            XmlNode xn = getNode(strNode);
            xn.InnerText = strValue;
 
        }
 
 
        /// <summary>
        /// 获得某一节点
        /// </summary>
        /// <param name="strNode"></param>
        /// <returns></returns>
        private XmlNode getNode(string strNode)
        {
            XmlNode xn = null;
 
            string[] strNodeNameArr = strNode.Trim(',').Split(',');
 
            foreach (string strNodeName in strNodeNameArr)
            {
                if (xn == null)
                {
                    if (strNodeName.IndexOf("*") > 0)
                    {
                        xn = getNodeListNode(strNodeName, xmlDoc);
                    }
                    else
                    {
                        xn = xmlDoc.SelectSingleNode(strNodeName);
                    }
                }
                else
                {
                    if (strNodeName.IndexOf("*") > 0)
                    {
                        xn = getNodeListNode(strNodeName, xn);
                    }
                    else
                    {
                        xn = xn.SelectSingleNode(strNodeName);
                    }
                    if (xn == null) throw new Exception("节点" + strNodeName + "不存在.");
                }
 
            }
 
            return xn;
 
        }
 
        /// <summary>
        /// 节点列表中单个节点取得
        /// </summary>
        /// <param name="strNode">节点列表节点名称:例;nodename*0 指节点名称是nodename的节点数组下标是0的节点取得</param>
        /// <param name="fatherXn">当前节点的父亲节点</param>
        /// <returns></returns>
        private XmlNode getNodeListNode(string strNode, XmlNode fatherXn)
        {
            XmlNode xn = null;
            string[] strNodeListNameAndArrNum = strNode.Split('*');
            XmlNodeList xnList = fatherXn.SelectNodes(strNodeListNameAndArrNum[0]);
            xn = xnList.Item(Convert.ToInt32(strNodeListNameAndArrNum[1]));
            return xn;
        }
 
 
 
        /// <summary>
        ///  节点属性值设定
        /// </summary>
        /// <param name="strNode">从父节点开始,中间用逗号隔开</param>
        /// <param name="strAttributeName">节点名称</param>
        /// <param name="strValue">节点值</param>
        public void setNodeAttributes(string strNode, string strAttributeName, string strValue)
        {
            XmlNode xn = getNode(strNode);
            try
            {
                xn.Attributes[strAttributeName].Value = strValue;
            }
            catch
            {
                throw new Exception("节点" + strNode + "不存在属性[" + strAttributeName + "].");
 
            }
        }
 
        /// <summary>
        /// 节点属性值取得
        /// </summary>
        /// <param name="strNode">从父节点开始,中间用逗号隔开</param>
        /// <param name="strAttributeName">节点名称</param>
        /// <returns></returns>
        public string getNodeAributeValue(string strNode, string strAttributeName)
        {
            try
            {
                XmlNode xn = getNode(strNode);
                return xn.Attributes[strAttributeName].Value;
            }
            catch
            {
                throw new Exception("节点" + strNode + "不存在属性[" + strAttributeName + "].");
            }
 
        }
      }
}

 

已知有一个XML文件(bookstore.xml)如下:

<?xml version="1.0" encoding="gb2312"?>

<bookstore>

<book genre="fantasy" ISBN="2-3631-4">

<title>Oberon's Legacy</title>

<author>Corets, Eva</author>

<price>5.95</price>

</book>

</bookstore>

1、往<bookstore>节点中插入一个<book>节点:

XmlDocument xmlDoc=new XmlDocument();

xmlDoc.Load("bookstore.xml");

XmlNode root=xmlDoc.SelectSingleNode("bookstore");//查找<bookstore>

XmlElement xe1=xmlDoc.CreateElement("book");//创建一个<book>节点

xe1.SetAttribute("genre","李赞红");//设置该节点genre属性

xe1.SetAttribute("ISBN","2-3631-4");//设置该节点ISBN属性

XmlElement xesub1=xmlDoc.CreateElement("title");

xesub1.InnerText="CS从入门到精通";//设置文本节点

xe1.AppendChild(xesub1);//添加到<book>节点中

XmlElement xesub2=xmlDoc.CreateElement("author");

xesub2.InnerText="候捷";

xe1.AppendChild(xesub2);

XmlElement xesub3=xmlDoc.CreateElement("price");

xesub3.InnerText="58.3";

xe1.AppendChild(xesub3);

root.AppendChild(xe1);//添加到<bookstore>节点中

xmlDoc.Save("bookstore.xml");

//===============================================

结果为:

<?xml version="1.0" encoding="gb2312"?>

<bookstore>

<book genre="fantasy" ISBN="2-3631-4">

<title>Oberon's Legacy</title>

<author>Corets, Eva</author>

<price>5.95</price>

</book>

<book genre="李赞红" ISBN="2-3631-4">

<title>CS从入门到精通</title>

<author>候捷</author>

<price>58.3</price>

</book>

</bookstore>

2、修改节点:将genre属性值为“李赞红“的节点的genre值改为“update李赞红”,将该节点的子节点<author>的文本修改为“亚胜”。

XmlNodeList nodeList=xmlDoc.SelectSingleNode("bookstore").ChildNodes;//获取bookstore节点的所有子节点

foreach(XmlNode xn in nodeList)//遍历所有子节点

{

XmlElement xe=(XmlElement)xn;//将子节点类型转换为XmlElement类型

if(xe.GetAttribute("genre")=="李赞红")//如果genre属性值为“李赞红”

{

xe.SetAttribute("genre","update李赞红");//则修改该属性为“update李赞红”

XmlNodeList nls=xe.ChildNodes;//继续获取xe子节点的所有子节点

foreach(XmlNode xn1 in nls)//遍历

{

XmlElement xe2=(XmlElement)xn1;//转换类型

if(xe2.Name=="author")//如果找到

{

xe2.InnerText="亚胜";//则修改

break;//找到退出来就可以了

}

}

break;

}

}

xmlDoc.Save("bookstore.xml");//保存。

//==================================================

最后结果为:

<?xml version="1.0" encoding="gb2312"?>

<bookstore>

<book genre="fantasy" ISBN="2-3631-4">

<title>Oberon's Legacy</title>

<author>Corets, Eva</author>

<price>5.95</price>

</book>

<book genre="update李赞红" ISBN="2-3631-4">

<title>CS从入门到精通</title>

<author>亚胜</author>

<price>58.3</price>

</book>

</bookstore>

3、删除 <book genre="fantasy" ISBN="2-3631-4">节点的genre属性,删除 <book genre="update李赞红" ISBN="2-3631-4">节点。

XmlNodeList xnl=xmlDoc.SelectSingleNode("bookstore").ChildNodes;

foreach(XmlNode xn in xnl)

{

XmlElement xe=(XmlElement)xn;

if(xe.GetAttribute("genre")=="fantasy")

{

xe.RemoveAttribute("genre");//删除genre属性

}

else if(xe.GetAttribute("genre")=="update李赞红")

{

xe.RemoveAll();//删除该节点的全部内容

}

}

xmlDoc.Save("bookstore.xml");

//===========================================

最后结果为:

<?xml version="1.0" encoding="gb2312"?>

<bookstore>

<book ISBN="2-3631-4">

<title>Oberon's Legacy</title>

<author>Corets, Eva</author>

<price>5.95</price>

</book>

<book>

</book>

</bookstore>

4、显示所有数据。

XmlNode xn=xmlDoc.SelectSingleNode("bookstore");

XmlNodeList xnl=xn.ChildNodes;

foreach(XmlNode xnf in xnl)

{

XmlElement xe=(XmlElement)xnf;

Console.WriteLine(xe.GetAttribute("genre"));//显示属性值

Console.WriteLine(xe.GetAttribute("ISBN"));

XmlNodeList xnf1=xe.ChildNodes;

foreach(XmlNode xn2 in xnf1)

{

Console.WriteLine(xn2.InnerText);//显示子节点点文本

}

}

已知有一个XML文件(bookstore.xml)如下:

<?xml version="1.0" encoding="gb2312"?>

<bookstore>

<book genre="fantasy" ISBN="2-3631-4">

<title>Oberon's Legacy</title>

<author>Corets, Eva</author>

<price>5.95</price>

</book>

</bookstore>

1、往<bookstore>节点中插入一个<book>节点:

XmlDocument xmlDoc=new XmlDocument();

xmlDoc.Load("bookstore.xml");

XmlNode root=xmlDoc.SelectSingleNode("bookstore");//查找<bookstore>

XmlElement xe1=xmlDoc.CreateElement("book");//创建一个<book>节点

xe1.SetAttribute("genre","李赞红");//设置该节点genre属性

xe1.SetAttribute("ISBN","2-3631-4");//设置该节点ISBN属性

XmlElement xesub1=xmlDoc.CreateElement("title");

xesub1.InnerText="CS从入门到精通";//设置文本节点

xe1.AppendChild(xesub1);//添加到<book>节点中

XmlElement xesub2=xmlDoc.CreateElement("author");

xesub2.InnerText="候捷";

xe1.AppendChild(xesub2);

XmlElement xesub3=xmlDoc.CreateElement("price");

xesub3.InnerText="58.3";

xe1.AppendChild(xesub3);

root.AppendChild(xe1);//添加到<bookstore>节点中

xmlDoc.Save("bookstore.xml");

//===============================================

结果为:

<?xml version="1.0" encoding="gb2312"?>

<bookstore>

<book genre="fantasy" ISBN="2-3631-4">

<title>Oberon's Legacy</title>

<author>Corets, Eva</author>

<price>5.95</price>

</book>

<book genre="李赞红" ISBN="2-3631-4">

<title>CS从入门到精通</title>

<author>候捷</author>

<price>58.3</price>

</book>

</bookstore>

2、修改节点:将genre属性值为“李赞红“的节点的genre值改为“update李赞红”,将该节点的子节点<author>的文本修改为“亚胜”。

XmlNodeList nodeList=xmlDoc.SelectSingleNode("bookstore").ChildNodes;//获取bookstore节点的所有子节点

foreach(XmlNode xn in nodeList)//遍历所有子节点

{

XmlElement xe=(XmlElement)xn;//将子节点类型转换为XmlElement类型

if(xe.GetAttribute("genre")=="李赞红")//如果genre属性值为“李赞红”

{

xe.SetAttribute("genre","update李赞红");//则修改该属性为“update李赞红”

XmlNodeList nls=xe.ChildNodes;//继续获取xe子节点的所有子节点

foreach(XmlNode xn1 in nls)//遍历

{

XmlElement xe2=(XmlElement)xn1;//转换类型

if(xe2.Name=="author")//如果找到

{

xe2.InnerText="亚胜";//则修改

break;//找到退出来就可以了

}

}

break;

}

}

xmlDoc.Save("bookstore.xml");//保存。

//==================================================

最后结果为:

<?xml version="1.0" encoding="gb2312"?>

<bookstore>

<book genre="fantasy" ISBN="2-3631-4">

<title>Oberon's Legacy</title>

<author>Corets, Eva</author>

<price>5.95</price>

</book>

<book genre="update李赞红" ISBN="2-3631-4">

<title>CS从入门到精通</title>

<author>亚胜</author>

<price>58.3</price>

</book>

</bookstore>

3、删除 <book genre="fantasy" ISBN="2-3631-4">节点的genre属性,删除 <book genre="update李赞红" ISBN="2-3631-4">节点。

XmlNodeList xnl=xmlDoc.SelectSingleNode("bookstore").ChildNodes;

foreach(XmlNode xn in xnl)

{

XmlElement xe=(XmlElement)xn;

if(xe.GetAttribute("genre")=="fantasy")

{

xe.RemoveAttribute("genre");//删除genre属性

}

else if(xe.GetAttribute("genre")=="update李赞红")

{

xe.RemoveAll();//删除该节点的全部内容

}

}

xmlDoc.Save("bookstore.xml");

//===========================================

最后结果为:

<?xml version="1.0" encoding="gb2312"?>

<bookstore>

<book ISBN="2-3631-4">

<title>Oberon's Legacy</title>

<author>Corets, Eva</author>

<price>5.95</price>

</book>

<book>

</book>

</bookstore>

4、显示所有数据。

XmlNode xn=xmlDoc.SelectSingleNode("bookstore");

XmlNodeList xnl=xn.ChildNodes;

foreach(XmlNode xnf in xnl)

{

XmlElement xe=(XmlElement)xnf;

Console.WriteLine(xe.GetAttribute("genre"));//显示属性值

Console.WriteLine(xe.GetAttribute("ISBN"));

XmlNodeList xnf1=xe.ChildNodes;

foreach(XmlNode xn2 in xnf1)

{

Console.WriteLine(xn2.InnerText);//显示子节点点文本

}

}

 

 

 

posted @ 2011-04-15 07:13  思考之驴  阅读(202)  评论(0编辑  收藏  举报