当前位置: 首页 > 图文教程 > XML家族 > XML > XML文档的基本操作

XML
XML简易教程之四
XML与HTML的结合(上)
XML与HTML的结合(下)
XML入门的常见问题(一)
XML入门的常见问题(二)
XMLHTTP资料
什么是XML
什么是 XML Web Service
XML正在接管Web服务 成为SOA的基础
怎么样在网页上读取远程xml的数据
XML教程—编写结构完整的XML文档
读写xml文件的2个小函数
XML文档的基本操作
初学者如何开发出一个高质量的J2EE系统
优化 JavaScript 代码
自动更新程序的设计框架
使Firefox对XML的处理兼容IE的节点处理方法
WML学习之四 锚和任务
WML学习之五 显示表单
WML学习之六 事件

XML文档的基本操作


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-17   浏览: 93 ::
收藏到网摘: n/a

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

<?xml version="1.0" encoding="gb2312"?>
<bookstore>
<book genre="fantasy" ISBN="2-3631-4">
<title>Oberons 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>Oberons 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>Oberons 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>Oberons 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);//显示子节点点文本
}
}

public static string DataToXml(string _ip,string _xmlType,bool _issavexml,string

_contenttype,string _message,string _sendtime,string _toip)
        {
            //return null;
            DataParser dp = new DataParser();
            dp.Message = _message;
            dp.IP = _ip;
            dp.XmlType = _xmlType;
            dp.isSaveXml = _issavexml;
            dp.ContentType = _contenttype;
            dp.Sendtime = _sendtime;
            dp.Toip = _toip;
            XmlDocument doc = new XmlDocument();
            XmlDeclaration newDec = doc.CreateXmlDeclaration("1.0",null,null);
            doc.AppendChild(newDec);
            XmlElement newRoot = doc.CreateElement("Requests");
            doc.AppendChild(newRoot);
            XmlElement newtitle = doc.CreateElement("Request");
            newtitle.SetAttribute("time", dp.Sendtime);
            newRoot.AppendChild(newtitle);
            XmlElement from = doc.CreateElement("from");
            from.SetAttribute("ip", dp.IP);
            from.SetAttribute("type", dp.XmlType);
            from.SetAttribute("ctntype", dp.ContentType);
            XmlNode xnfrom = doc.CreateNode(XmlNodeType.CDATA, "content", null);
            xnfrom.InnerText = _message;
            from.PrependChild(xnfrom);
          // from.InnerText = _message;
            newtitle.AppendChild(from);
            XmlElement to = doc.CreateElement("to");
            (to as XmlElement).SetAttribute("ip", dp.Toip);
            newtitle.AppendChild(to);
            return doc.OuterXml;
        }

        /// <summary>
        /// 数据解包
        /// 将xml解析成UserConnection对象
        /// </summary>
        /// <returns>UserConnection</returns>
        public static DataParser[] XmlToData(string outxml)
        {
            //return null;
            DataParser[] dp = null;
            try
            {
                XmlDocument doc = new XmlDocument();
                doc.LoadXml(outxml);
                XmlNode rootnode = doc.SelectSingleNode("Requests");
                XmlNodeList bodynodelist = rootnode.SelectNodes("Request");
                dp = new DataParser[bodynodelist.Count];
                foreach (XmlNode sn in bodynodelist)
                {
                    int i = 0;
                    XmlElement xe = (XmlElement)sn;
                    XmlNode xn = sn.SelectSingleNode("from");
                    dp[i] = new DataParser();
                    dp[i].IP = (xn as XmlElement).Attributes["ip"].Value;
                   
                  // dp[i].IP = (xn as XmlElement).GetAttribute("ip");
                    dp[i].Message = xn.InnerText;
                    dp[i].ContentType = (xn as XmlElement).Attributes["ctntype"].Value;
                    dp[i].XmlType = (xn as XmlElement).Attributes["type"].Value;
                    dp[i].Sendtime = (sn as XmlElement).Attributes["time"].Value;
                    XmlNode xn2 = sn.SelectSingleNode("to");
                    dp[i].Toip = (xn2 as XmlElement).Attributes["ip"].Value;
                    i++;

                }


            }
            catch (Exception err)
            {
                ChatCommon.Common.ExceptionHand.HandleErr(err.ToString());
            }
            return dp;
        }

 

using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
namespace XmlDOM
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlDocument doc = new XmlDocument();
            XmlDeclaration xd = doc.CreateXmlDeclaration("1.0", null, null);
            doc.AppendChild(xd);
            XmlElement xe = doc.CreateElement("bookstore");
            doc.AppendChild(xe);
            XmlElement xr = doc.CreateElement("book");
            xr.SetAttribute("publish", "thinkbank+1");
            xr.InnerText = "c#基础";
            xe.AppendChild(xr);
            XmlElement xr2 = doc.CreateElement("book");
            xr2.SetAttribute("publish", "thinkbank+1");
            xr2.InnerText = "j#基础";
            xe.AppendChild(xr2);
            string xml = doc.OuterXml;
            XmlDocument doc2 = new XmlDocument();
            doc2.LoadXml(xml);
            //doc.Save(@"d:/33.xml");
            //XmlDocument doc = new XmlDocument();
            //doc.Load(@"d:/33.xml");
            ////XmlNode xn = doc.SelectSingleNode("bookstore");
            XmlNodeList xnlist = doc2.SelectNodes("//book");
            foreach (XmlNode mynode in xnlist)
            {
                Console.WriteLine(mynode.InnerText);
            }
          
        }
    }
}

 

XPath 应用:


XML 文档对象模型 (DOM)
能够以编程方式读取、处理和修改 XML 文档。

XPath 表达式
XPath 表达式使用路径表示法(与 URL 中使用的路径表示法类似)寻址 XML 文档的各个部分。表达式计算为生

成子元素集、布尔值、数字或字符串类型的对象。

URL与XPath 表达式比较
URL: 由文件系统中的文件夹和文件组成的层次结构。
每个级别具有唯一名称的文件。URL 总是标识单个文件。
相对特定文件夹(称为“当前文件夹”)进行计算。
XPath: 由 XML 文档中的元素和其他元素组成的层次结构。
每个级别的元素名可能不是唯一的。XPath 表达式标识所有匹配的元素集。
相对特定元素(称为表达式的“上下文”)进行计算。

基本 XPath 表达式 (判断是谁的集合!!)
1.当前上下文
   以句点和正斜杠 (./) 作为前缀的表达式明确使用当前上下文作为上下文。例如,以下表达式引用当前上下文

中的所有 <author> 元素:
    ./author
   注意,此表达式等效于以下表达式:
    author

2.文档根
   以正斜杠 (/) 为前缀的表达式使用文档树的根作为上下文。例如,以下表达式引用此文档根的 <bookstore>

元素:
    /bookstore
3.根元素
   使用正斜杠后接星号 (/*) 的表达式将使用根元素作为上下文。例如,以下表达式查找文档的根元素:
    /*
4.递归下降
   用双正斜杠 (//) 的表达式指示可以包括零个或多个层次结构级别的搜索。如果此运算符出现在模式的开头,

上下文相对于文档的根。例如,以下表达式引用当前文档中任意位置的所有 <author> 元素:
    //author
   .// 前缀指示上下文从层次结构中当前上下文所指示的级别开始。
5.特定元素
   以元素名开头的表达式引用特定元素的查询,从当前上下文节点开始。例如,以下表达式引用当前上下文节点

中 <images> 元素内的 <background.jpg> 元素:
    images/background.jpg
   以下表达式引用当前上下文节点中 <bookstore> 元素内的 <book> 元素的集合:
    bookstore/book
   以下表达式引用当前上下文节点中的所有 <first.name> 元素:
    first.name
XPath 表达式是使用下表中所示的运算符和特殊字符构造的。
运算符和特殊字符:
/ 子运算符;选择左侧集合的直接子级。此路径运算符出现在模式开头时,表示应从根节点选择该子级。
// 递归下降;在任意深度搜索指定元素。此路径运算符出现在模式开头时,表示应从根节点递归下降。
. 指示当前上下文。
.. 当前上下文节点的父级。
* 通配符;选择所有元素,与元素名无关。
@ 属性;属性名的前缀。
@* 属性通配符;选择所有属性,与名称无关。
: 命名空间分隔符;将命名空间前缀与元素名或属性名分隔。
( ) 为运算分组,明确设置优先级。
[ ] 应用筛选模式。
[ ] 下标运算符;用于在集合中编制索引。
+ 执行加法。
- 执行减法。
div 根据 IEEE 754 执行浮点除法。
* 执行乘法。
mod 从截断除法返回余数。

优先级   字符   用途
1   ( )   分组
2   [ ]   筛选器
3   / //   路径运算

分组运算符()仅适用于顶级路径表达式。
例如:
   (//author/degree | //author/name) 是有效的分组运算
   //author/(degree | name) 不是有效的分组运算
筛选模式运算符 [] 的优先级高于路径运算符(/ 和 //)。
例如:
   //comment()[3]
   选择相对于文档中任意位置comment的父级索引等于3的所有comment,可以返回多个备注

   (//comment())[3]
   选择相对于父级的所有comment集中的第三个comment,只能返回一个备注。

   author/first-name
   当前上下文节点的 <author> 元素中的所有 <first-name> 元素。

   bookstore//title
   <bookstore> 元素中更深的一级或多级(任意子代)的所有 <title> 元素。注意,此表达式与以下模式

bookstore/*/title 不同。

   bookstore/*/title
   属于 <bookstore> 元素的孙级的所有 <title> 元素。

   bookstore//book/excerpt//emph
   <book> 元素的 <excerpt> 子级中的任意位置和 <bookstore> 元素中的任意位置的所有 <emph> 元素:

   .//title
   当前上下文中更深的一级或多级的所有 <title> 元素。注意,本质上只有这种情况需要句点表示法。
通配符
通过使用通配符 * 集合,不使用元素名即可引用元素。* 集合引用作为当前上下文的子级的所有元素,与名称无

关。
例如:
   author/*
   <author> 元素的所有元素子级。

   book/*/last-name
   所有作为 <book> 元素的孙级的 <last–name> 元素。

   */*
   当前上下文的所有孙级元素。

   my:book
   my 命名空间中的 <book> 元素。

   my:*
   my 命名空间中的所有元素。
属性
XPath 使用 @ 符号表示属性名。属性和子元素应公平对待,两种类型之间的功能应尽可能相当。
例如:
   @style
   当前元素上下文的 style 属性。

price/@exchange
   当前上下文中 <price> 元素的 exchange 属性。
  
   book/@style
    所有 <book> 元素的 style 属性。
  
    @*
    当前上下文节点的所有属性。
  
    @my:*
    my 命名空间中的所有属性。不包括 my 命名空间中的元素的未限定属性。
  
   注意:
    属性不能包含子元素,所以,如果对属性应用路径运算符,将出现语法错误。此外,不能对属性应用索引,

因为根据定义,不为属性定义任何顺序。
   price/@exchange/total
比较
运算符:

   and   逻辑与
   or   逻辑或
   not()   非
   =   相等
   !=   不相等
   &lt;   小于
   &lt;=   小于或等于
   &gt;   大于
   &lt;=   大于或等于
   |   集运算;返回两个节点集的联合


例如:
   author[last-name = "Bob"]
   至少包含一个值为 Bob 的 <last-name> 元素的所有 <author> 元素。

   author[last-name[1] = "Bob"]
   第一个 <last-name> 子元素的值为 Bob 的所有 <author> 元素。

   author/degree[@from != "Harvard"]
   包含 from 属性不等于 "Harvard" 的 <degree> 元素的所有 <author> 元素。

   author[last-name = /editor/last-name]
   包含与根元素下 <editor> 元素中的 <last-name> 元素相同的 <last-name> 元素的所有 <author> 元素。

   author[. = "Matthew Bob"]
   所有字符串值为 Matthew Bob 的 <author> 元素。
集运算
Union (|) 运算符
|(即 union)运算符返回两个操作数的联合,操作数必须是节点集。例如,//author | //publisher 返回的节

点集结合了所有 //author 节点和所有 //publisher 节点。


例如:
   first-name | last-name
   包含当前上下文中的 <first-name> 和 <last-name> 元素的节点集。

   (bookstore/book | bookstore/magazine)
   包含 <bookstore> 元素中的 <book> 或 <magazine> 元素的节点集。

   book | book/author
    包含 <book> 元素中的所有 <book> 元素和所有 <author> 元素的节点集。

   (book | magazine)/price
    包含 <book> 或 <magazine> 元素的所有 <price> 元素的节点集。


筛选器和筛选模式

通过将筛选子句 [pattern] 添加到集合中,可以对任何集合应用约束和分支。筛选器类似于 SQL WHERE 子句。

筛选器中包含的模式称为“筛选模式”。

例如:
   book[excerpt]
   至少包含一个 <excerpt> 元素的所有 <book> 元素。

   book[excerpt]/title
   至少包含一个 <excerpt> 元素的 <book> 元素内的所有 <title> 元素。

   book[excerpt]/author[degree]
   至少包含一个 <degree> 元素并且在至少包含一个 <excerpt> 元素的 <book> 元素内的所有 <author> 元素

   book[author/degree]
   至少包含一个 <author> 元素并且该元素至少包含一个 <degree> 子元素的 <book> 所有元素。

   book[excerpt][title]
   至少包含一个 <excerpt> 元素以及至少包含一个 <title> 元素的 <book> 所有元素。