读取Xml文档的元素和属性

<?xml version="1.0" encoding="utf-8" ?>
<StuInfo>
  <student>
    <ID>1001</ID>
    <Name>张三</Name>
    <Sex>男</Sex>
    <Birthday age="23">1987-1-12</Birthday>
  </student>
  <student>
    <ID>1002</ID>
    <Name>李四</Name>
    <Sex>女</Sex>
    <Birthday age="24">1986-5-12</Birthday>
  </student>
  <student>
    <ID>1003</ID>
    <Name>王二</Name>
    <Sex>男</Sex>
    <Birthday age="25">1985-1-15</Birthday>
  </student>
</StuInfo>

看看上面的文档,当我们把它加载到内存中之后,各个节点都有自己的类型,首先整个xml都是document文档

<?xml version="1.0" encoding="utf-8" ?>
它则是XmlDeclaration类型的

下面的StuInfo,student,ID,Name,sex,Birsthday都是Element类型

1001,1002,1003,张三,李四,王五等都是#Text类型的

知道上面的这些之后,那么我们在读取元素的时候就可以通过某个节点的ChildNodes属性获取其子节点的集合,然后根据节点的类型,也就是NodeType属性确定此节点是否是元素节点,或者文档节点等,元素节点的名称可以通过Names属性获取,其所对应的XML数据可以有InnerXml和OutXml,InnerText等来获取

读取属性:

要访问属性的值,必须获取该属性的所属的元素,当节点是元素的时候,可以通过HasAttribute方法查看是否存在任何与此元素相关的属性,然后检索属性,通过XmlNode.Attributes[index]获得相关值

下面看一个实例

 protected void Page_Load(object sender, EventArgs e)
    {
        if(!IsPostBack)
        {
            XmlDocument doc = new XmlDocument();
            string path = Server.MapPath("~/XMLFile.xml");
            doc.Load(path);
            OperateXml(doc);
        }
    }

    #region 对xml文件进行操作的方法
    public void OperateXml(XmlNode doc)
    {
       //通过XmlDocument把xml文件加载到内存中,然后才能对其操作
       Response.Write("<li>节点类型"+doc.NodeType.ToString()+"节点名称"+doc.LocalName);
       if (!doc.HasChildNodes)
       {
           Response.Write(" " + doc.InnerXml);
       }
       if(doc.NodeType==XmlNodeType.Element)
       {
          
           if(doc.Attributes.Count>0)
           {
               XmlAttribute dd = new XmlAttribute();
              
               for (int i = 0; i < doc.Attributes.Count; i++)
               {
                   Response.Write("属性:" + doc.Attributes[i].LocalName + "=" + doc.Attributes[i].Value);
               }
           }
           if(doc.ChildNodes[0].NodeType==XmlNodeType.Text)
           {
               Response.Write(" 值为"+doc.InnerText);
           }
       } 
       if (doc.HasChildNodes)
       {
           for (int i = 0; i < doc.ChildNodes.Count; i++)
           {
               OperateXml(doc.ChildNodes[i]);
           }
       }
      
    }
    #endregion
}

在这里采用的递归的方式完成的对子节点的操作

里面的方法很多,操作的时候灵活使用!

posted @ 2011-02-23 14:59  双魂人生  阅读(5617)  评论(0编辑  收藏  举报