xml文件的建立、添加、查询

1。xml文件的建立。关于如何分满xml文件会在“xml文件的添加”部分说明。

=======================code====================================

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

                // 创建XmlTextWriter类的实例对象
                XmlTextWriter textWriter = new XmlTextWriter(@"c:/test.xml", null); //文件位置
                textWriter.Formatting = Formatting.Indented; //设置缩进格式

                // 开始写过程,调用WriteStartDocument方法
                textWriter.WriteStartDocument();

                // 写入说明
                textWriter.WriteComment("中国行政区划");

                //创建一个节点
                textWriter.WriteStartElement("Country");
                textWriter.WriteElementString("Region", "华北");
                textWriter.WriteEndElement();

                // 写文档结束,调用WriteEndDocument方法
                textWriter.WriteEndDocument();

                // 关闭textWriter
                textWriter.Close();
          
=====================code ending=======================================
结果:

  <?xml version="1.0" ?>
- <!-- 中国行政区划  -->
- <Country>
   <Region>华北</Region>
  </Country>


2。xml文件的添加,xml文件制作的主要部分。
 (1)添加
====================code========================================
        //添加节点
        string fileName = @"c:/test.xml";       //文件位置
        XmlDocument xmlDoc = new XmlDocument(); //load xml
        xmlDoc.Load(fileName);

        XmlNode xn = xmlDoc.SelectSingleNode("Country");   
            //添加哪个标签的子级(注意SelectSingleNode函数是返回同级的第一个节点,其用法在后文描述)
        XmlElement xmlElem1 = xmlDoc.CreateElement("Region");   //添加部分的标签
        xmlElem1.SetAttribute("备注","黑土地");     //添加属性
        xmlElem1.InnerText = "东北";                //内容
        xn.AppendChild(xmlElem1);                   //添加
        XmlElement xmlElem2 = xmlDoc.CreateElement("Region");              //添加部分的标签
        xmlElem2.SetAttribute("备注", "黄土地");    //添加属性
        xmlElem2.SetAttribute("面积", "挺大");      //再添加一个属性
        xmlElem2.InnerText = "中南";                //内容
        xn.AppendChild(xmlElem2);                   //添加

       xmlDoc.Save(fileName);  //存盘
=====================code ending=====================================
结果:
  <?xml version="1.0" ?>
- <!-- 中国行政区划 -->
- <Country>
  <Region>华北</Region>
  <Region 备注="黑土地">东北</Region>
  <Region 备注="黄土地" 面积="挺大">中南</Region>
  </Country>

注意:a. AppendChild方法的添加都是以最后一个节点的身份添加在那一级的节点之后
          b. 如果上面部分程序运行2次是添加2遍的。


 (2)如何选择添加在什么地方添加
=====================code======================================
        string fileName = @"c:/test.xml";       //文件位置
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(fileName);

        string content = "黑龙江";  //要添加的内容
        string parentContent = "东北";  //添加在谁的子级下
        //此处即把“黑龙江”添加在“东北”节点下面
        XmlElement xmlElemChild;     //要添加的节点
        XmlNode xnParent;
        XmlNodeList xnParentList;  //父结点可能出处列表
        int i;

        xmlElemChild = xmlDoc.CreateElement("Region");  //创造要添加的节点
        xmlElemChild.InnerText = content;

        //找到要插入内容的父节点位置
        xnParentList = xmlDoc.DocumentElement.SelectNodes("//Country['" + parentContent + "']");
         //SelectNodes返回的是节点列表,xmlNodeList类型
        xnParent = null;
        for (i = 0; i < xnParentList.Count; i++)
        {
            //先判断前面的长度,如果长度条件符合再判断内容是否一致
            if (xnParentList.Item(i).InnerText.Length >= parentContent.Length &&
                xnParentList.Item(i).InnerText.Substring(0, parentContent.Length) == parentContent)
            {
                xnParent = xnParentList.Item(i); //找到了
                break;
            }
               /*InnerText属性是返回此节点“及其子节点”的字符串链,去最前面parentContent.Length的长度就是
                  所要找的节点内容*/
        }
        if (xnParent!=null)
        {
               xnParent.AppendChild(xmlElemChild);  //添加
        }

        xmlDoc.Save(fileName);  //存盘
==================code ending===================================
结果:
<?xml version="1.0" ?>
- <!-- 中国行政区划-->
- <Country>
   <Region>华北</Region>
 - <Region 备注="黑土地">
    东北
    <Province>黑龙江</Province>
   </Region>
   <Region 备注="黄土地" 面积="挺大">中南</Region>
  </Country>


注意:此处用的是查找父结点的方法找到要添加在什么位置,同时又使用的AppendChild方法,所以只能确定地把要添加的内容添加到指定节点子级,而不能添加到指定节点子级的指定位置(只能作为最后一个元素加进去)


3。xml文件的查找
 (1)查找指定节点
====================code=============================================
        xnTargetList = xmlDoc.DocumentElement.SelectNodes("//*['" + target + "']");
        xnTarget = null;
        for (i = 0; i < xnTargetList.Count; i++)
        {           
            if (xnTargetList.Item(i).InnerText.Length >= target.Length &&
                xnTargetList.Item(i).InnerText.Substring(0, target.Length) == target)
            {
                xnTarget = xnTargetList.Item(i); //找到了
                break;
            }
        }
====================code ending====================================
     a. xnTarget即储存找到的结果
     b. 关键是SelectNodes函数,下面列出SelectNodes常用写法(同样适用于SelectSingleNode函数):
        /    指示节点路径                                                                       --路径匹配
        //   所有路径以"//"后指定的子路径结尾的元素
        *    路径的通配符

        /A/B/C[1]              A元素→B元素→C元素的第一个子元素              --位置匹配
        /A/B/C[last()]         A元素→B元素→C元素的最后一个子元素  
        /A/B/C[position()>1]   A元素→B元素→C元素之下的位置号大于1的元素

        //B[@id]      所有具有属性id的B元素                                            --属性匹配

        //E/parent::* 所有E节点的父节点元素                                          --亲戚关系匹配  
        /A/child::* A的子元素

        详情可参阅:http://blog.csdn.net/zhuyoulang/archive/2007/12/05/1918599.aspx

 (2)遍历指定节点的全部子节点
=====================code========================================
        xnTargetList = xmlDoc.DocumentElement.SelectNodes("//*['" + target + "']");
        xnTarget = null;
        for (i = 0; i < xnTargetList.Count; i++)
        {           
            if (xnTargetList.Item(i).InnerText.Length >= target.Length &&
                xnTargetList.Item(i).InnerText.Substring(0, target.Length) == target)
            {
                xnTarget = xnTargetList.Item(i); //找到了
                break;
            }
        }

        xnSelfList = xmlDoc.DocumentElement.SelectNodes("/xnTarget/child::*");
        for (i = 0; i < xnSelfList.Count; i++)
        {
            if (xnSelfList.Item(i).InnerText.IndexOf(childContent) >= 0)
            {
                XmlNodeList tempXnList = xnParent.ChildNodes;
                for (int k = 1; k < tempXnList.Count; k++)
                {
                    visit(tempXnList.Item(k).FirstChild.Value == childContent)
                }
             }
        }
=================code ending=====================================

 (3)按属性查找
        XmlNodeList xnl=xmlDoc.SelectSingleNode("targetTag").ChildNodes;
        //其中string targetTag是要查找的内容的标签
        foreach(XmlNode xn in xnl)
        {
                XmlElement xe=(XmlElement)xn;
                if(xe.GetAttribute("genre")=="fantasy")
                {
                        findit();
                }   
        }

       网络上最常见的方法,最简单,但相对不易应用,因为SelectSingleNode只能找到同级的第一个节点,而不是定向查找。

 

 


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值