C# 操作XML

1、向文件中写入XML

            XmlDocument xmlDoc = new XmlDocument();//在内存中构建一个Dom对象
            XmlDeclaration xmld = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", "yes");//指定文档声明
            xmlDoc.AppendChild(xmld);//将文档说明添加到文档中去

            XmlElement rootElement = xmlDoc.CreateElement("school");//创建一个根元素,school
            xmlDoc.AppendChild(rootElement);//将根元素加入进去

            XmlElement xmlClassElement = xmlDoc.CreateElement("class");//为根元素(school)添加子元素
            XmlAttribute attr = xmlDoc.CreateAttribute("id");//为class添加属性 id,
            attr.Value = "c01";//id的值为c01
            xmlClassElement.Attributes.Append(attr);//将属性添加到class标签中去。
            rootElement.AppendChild(xmlClassElement);//将class元素添加到school标签中去

            XmlElement xmlStudentElement = xmlDoc.CreateElement("student");//创建一个student元素
            attr = xmlDoc.CreateAttribute("sid");//创建一个名叫sid的属性
            attr.Value = "s011";//属性的值为s011
            xmlStudentElement.Attributes.Append(attr); //将属性添加到元素中去
            xmlClassElement.AppendChild(xmlStudentElement);//将student节点加到class节点中去

            XmlElement xmlNameElement = xmlDoc.CreateElement("name");
            xmlNameElement.InnerText = "james";
            XmlElement xmlAgeElement = xmlDoc.CreateElement("age");
            xmlAgeElement.InnerText = "18";
            xmlStudentElement.AppendChild(xmlNameElement);
            xmlStudentElement.AppendChild(xmlAgeElement);

            xmlDoc.Save("school.xml");//将该Dom对象写入到XML文件中
兼容.net 2.0版本

 

            XDocument xDoc = new XDocument();//创建一个Dom对象
            XDeclaration xDeclaration = new XDeclaration("1.0", "utf-8", null);//声明文档类型
            xDoc.Declaration = xDeclaration;//添加文档类型
            XElement rootElement = new XElement("school");//创建根节点
            xDoc.Add(rootElement);//将school节点添加进文档中
            XElement xClass = new XElement("class");//创建一个class元素
            xClass.SetAttributeValue("id", "c01");//为class标签添加属性和值。
            rootElement.Add(xClass);
            XElement student = new XElement("student");
            student.SetAttributeValue("id", "s001");//为student节点设置属性
            student.SetElementValue("Name", "curry");//在student节点中,添加叶子节点Name,值为curry
            student.SetElementValue("age", 17);//在student节点中,添加叶子节点age,值为17
            student.SetElementValue("sex", "male");//在student节点中,添加叶子节点sex,值为male
            xClass.Add(student);//将student节点添加到class节点中去。
            xDoc.Save("xuexiao.xml");//如果这个文件不存在,那么就会创建一个并写入内容。如果这个文件存在,那么就会覆盖掉内容。
3.5以后的版本

 

2、从文件中读取XML

 

            XmlDocument document = new XmlDocument();//将xml文件加载进来
            document.Load("xuexiao.xml");//将xml文件加载到对象上
            XmlElement rootElement = document.DocumentElement;//获取根节点。
            //rootElement.Name;//获取节点的名字
            foreach (XmlNode item in rootElement.ChildNodes)//遍历根节点下的所有节点(包括注释……等,这些节点有些是实际上用不着的,所有下面需要进行判断)
            {
                if (item.NodeType == XmlNodeType.Element)
                {//判断当前节点的类型是否是元素节点
                    string nodeName = item.Name;//获取当前节点的名称
                }
                else if (item.NodeType == XmlNodeType.Text | item.NodeType == XmlNodeType.CDATA)
                {
                    string text = item.InnerText;
                }
            }
兼容2.0

 

            XDocument document = XDocument.Load(@"xuexiao.xml");//加载XML文件
            XElement rootElement = document.Root;//获取根节点
            rootElement.Elements();//获取当前根节点下的所有子元素。如果在elements中增加"class",那么就表明要获取当前节点下的,所有名字叫class的元素
            rootElement.Element("class");//获取当前节点下的,名字叫class的子元素
            //遍历根节点下的所有子元素
            foreach (XElement item in rootElement.Elements())
            {
                string nodeName = item.Name.ToString();//获取节点的名字
                item.Attributes();//属性
                if (item.Elements().Count() == 0)
                { //如果该节点下没有子节点了。那么就去找该节点的value值
                    string valStr = item.Value;
                }
            }
            //xml中获取某节点 (3.5以后)
            //获取根节点中,名字叫class的节点,并且这些class的节点的ID都大于10
            IEnumerable<XElement> items = rootElement.Descendants("class").Where(x => Convert.ToInt32(x.Attribute("id").Value) > 10);
3.5以后
 public List<ViewModelSelect> GetFunctionNameWithXML(string strPath)
        {
            List<ViewModelSelect> listVms = new List<ViewModelSelect>();
            XDocument document = XDocument.Load(strPath);//加载XML文件
            XElement rootElement = document.Root;//获取根节点
            GetXElement(rootElement, ref listVms);
            return listVms;
        }
        private void GetXElement(XElement root, ref  List<ViewModelSelect> listVms)
        {
            //返回IEnumerable接口的对象,都可以实现foreach循环遍历
            foreach (XElement element in root.Elements())
            {
                //递归
                if (element.Elements().Count() > 0)
                {
                    GetXElement(element, ref listVms);
                }
                else
                {
                    ViewModelSelect vms = new ViewModelSelect();
                    vms.ModelName = element.Value;
                    vms.Fac = element.FirstAttribute.Value;
                    listVms.Add(vms);
                }
            }
        }
3.5以后,递归获取XML节点内容

 

 

如果xml文件是导航节点,那么在获取到根节点之后,写一个递归,然后调用递归就可以了。
posted @ 2018-01-06 22:43  水墨晨诗  阅读(242)  评论(0编辑  收藏  举报