Linq to XML

            //创建XML文档
            XmlDocument xdc = new XmlDocument();
            //创建根元素
            XmlElement sprites = xdc.CreateElement("Sprites");
            //第一个精灵
            XmlElement sprite1 = xdc.CreateElement("Sprite01");
            //职业
            XmlElement profession1 = xdc.CreateElement("Profession");
            profession1.InnerText = "法师";
            //武器
            XmlElement weapon1 = xdc.CreateElement("Weapon");
            weapon1.InnerText = "魔杖";
            //添加上述节点
            sprites.AppendChild(sprite1);
            sprite1.AppendChild(profession1);
            sprite1.AppendChild(weapon1);
            //同理
            //第二个精灵
            XmlElement sprite2 = xdc.CreateElement("Sprite02");
            //职业
            XmlElement profession2 = xdc.CreateElement("Profession");
            profession2.InnerText = "战士";
            //武器
            XmlElement weapon2 = xdc.CreateElement("Weapon");
            weapon2.InnerText = "屠龙刀";
            //添加上述节点
            sprites.AppendChild(sprite2);
            sprite2.AppendChild(profession2);
            sprite2.AppendChild(weapon2);
            //第三个精灵
            XmlElement sprite3 = xdc.CreateElement("Sprite03");
            //职业
            XmlElement profession3 = xdc.CreateElement("Profession");
            profession3.InnerText = "道士";
            //武器
            XmlElement weapon3 = xdc.CreateElement("Weapon");
            weapon3.InnerText = "倚天剑";
            //添加上述节点
            sprites.AppendChild(sprite3);
            sprite3.AppendChild(profession3);
            sprite3.AppendChild(weapon3);
            //根节点添加到xml文档
            xdc.AppendChild(sprites);
            xdc.Save(@"d:\\Sprites.xml");

            //--------------------------------------
            XAttribute xa;
            XElement Sprite01 = new XElement("Sprite01",
                new XAttribute("Profession", "法师"),
                xa = new XAttribute("Weapon", "魔杖")
                );
            Console.WriteLine("XML数据修改前:\n{0}", Sprite01.ToString());
            Console.WriteLine("属性{0}的父节点:\n{1}", xa.ToString(), xa.Parent.ToString());
            Console.WriteLine("XML数据修改后:");
            //删除属性
            xa.Remove();
            //修改指定属性值
            Sprite01.Attribute("Profession").Value = "魔法师";
            Console.WriteLine(Sprite01);


            XElement sprites2 = new XElement(
                "Sprites",
                new XComment("注释:下面是所有精灵的介绍"),//创建注释
                new XElement("Sprite01",
                    new XElement("Profession", "法师"),
                    new XElement("Weapon", "魔杖")),
                    new XElement("Sprite02",
                        new XElement("Profession", "战士"),
                        new XElement("Weapon", "屠龙刀")),
                        new XElement("Sprite03",
                            new XElement("Profession", "道师"),
                            new XElement("Weapon", "倚天剑")));
            Console.WriteLine(sprites2);


            //---------------------------

            //创建XML文档
            XDocument xml = new XDocument();
            //创建XML声明
            XDeclaration declaration = new XDeclaration("1.0", "GB2312", "no");//xml版本1.0,汉字编码,需要外部文档来解析
            //创建XML文档类型
            XDocumentType documenttype = new XDocumentType("Sprites", null, "Sprites.dtd", null);//外部解析文档Sprites.dtd
            //创建XML处理指令
            XProcessingInstruction instruction = new XProcessingInstruction("xml-stylesheet", "href=\"Sprites.css\" type=\"text/css\"");//引用Sprites.css文档来定义xml文档的表现形式
            //创建XML CData值
            XCData data1 = new XCData("<H1>法师<H1>");
            XCData data2 = new XCData("<H1>道士<H1>");
            //创建XML元素
            XElement Sprites = new XElement("Sprites",
                new XElement("Sprite",
                    new XElement("Profession", data1),
                    new XElement("Weapon", "魔杖")),
                    new XComment("用xml属性的方式创建xml元素"),//创建xml注释
                    new XElement("Sprite",
                        new XAttribute("Profession", "战士"),//创建xml属性
                        new XAttribute("Weapon", "屠龙刀")),//创建xml属性
                        new XElement("Sprite",
                            new XElement("Profession", data2),
                            new XElement("Weapon", "倚天剑")));
            //指定xml文档声明
            xml.Declaration = declaration;
            //添加xml文档类型
            xml.Add(documenttype);
            //添加xml处理指令
            xml.Add(instruction);
            //添加xml元素
            xml.Add(Sprites);
            //保存xml文档
            xml.Save(@"d:\\Sprites.xml");

            //---------------------------------------------
            XElement Sprites2 = new XElement("Sprites",
                new XElement("Sprite",
                    new XElement("Profession", "法师"),
                    new XElement("Weapon", "魔杖")),
                    new XElement("Sprite",
                        new XAttribute("Profession", "战士"),
                        new XAttribute("Weapon", "屠龙刀")),
                        new XElement("Sprite",
                            new XElement("Profession","道士"),
                            new XElement("Weapon", "倚天剑")));
            //保存到指定文件
            Sprites.Save(@"d:\\Sprites.xml");
            //保存到TextWriter
            StringWriter sw = new StringWriter();
            Sprites2.Save(sw,SaveOptions.DisableFormatting);
            Console.WriteLine(sw);
            //保存到XmlWriter
            XmlWriter xw = XmlWriter.Create(@"d:\\Sprites1.xml");
            Sprites2.Save(xw);
            //写入文件
            xw.Flush();

 

            //-------------------------------------------------
            XElement loadSprites = XElement.Load(@"d:\\Sprites.xml",LoadOptions.SetBaseUri|LoadOptions.SetLineInfo);
            //添加新元素
            loadSprites.Elements("Sprite").Last().AddAfterSelf(
                new XElement("Sprite",
                    new XAttribute("Profession","猎人"),
                    new XAttribute("Weapon", "弓箭")));
            //输出xml信息
            Console.WriteLine(loadSprites);
            Console.WriteLine("---------------------------------");
                         //获取文件基URL信息
            string baseUri = loadSprites.BaseUri;
                         Console.WriteLine("xml基URL信息:{0}",baseUri);
            Console.WriteLine("---------------------------------");
            //输出xml中每一个元素的行信息
            foreach (var s in loadSprites.DescendantsAndSelf())
            {
                Console.WriteLine("元素名称:{0} 行信息:{1}",s.Name,
                    ((IXmlLineInfo)s).HasLineInfo()?((IXmlLineInfo)s).LineNumber.ToString():"无行号");
            }
 
            //--------------------------------------------------
            //xml字符串
            string str_xml = @"<Sprites>
                                <Sprite>
                                <Profession>法师</Profession>
                                <Weapon>魔杖</Weapon>
                                </Sprite>
                                <Sprite>
                                <Profession>战士</Profession>
                                <Weapon>屠龙刀</Weapon>
                                </Sprite>
                                <Sprite>
                                <Profession>道士</Profession>
                                <Weapon>倚天剑</Weapon>
                                </Sprite>
                              </Sprites>";

            XElement SpritesFromString = XElement.Parse(str_xml);
            Console.WriteLine(SpritesFromString);


            //--------------------------------------------------
            //建立xml文档
            XDocument document = new XDocument();
            //建立节点
            XNode node;
            XElement SpritesForeach = new XElement("Sprites",
                new XElement("Sprite",
                    new XElement("Profession", "法师"),
                    new XElement("Weapon", "魔杖")),
                    new XElement("Sprite",
                        node=new XElement("Profession", "战士"),
                        new XElement("Weapon", "屠龙刀")),
                        new XElement("Sprite",
                            new XElement("Profession", "道士"),
                            new XElement("Weapon", "倚天剑")));
            //添加根元素到文档对象中
            document.Add(SpritesForeach);
            //当前节点上一个节点
            Console.WriteLine("当前节点上一个节点:{0}",node.PreviousNode);
            //当前节点
            Console.WriteLine("当前节点:{0}",node);
            //当前节点的下一个节点
            Console.WriteLine("当前节点的下一个节点:{0}",node.NextNode);
            //当前节点的文档对象
            Console.WriteLine("当前节点的文档对象:{0}",node.Document);
            //当前节点的父节点
            Console.WriteLine("当前节点的父节点:{0}",node.Parent);

            //-------------------------------------------------
            //建立节点
            XNode node2;
            //建立元素
            XElement element;
            //建立xml数据源
            XElement SpritesForeach2 = new XElement("Sprites",
                new XElement("Sprite",
                    new XElement("Profession", "法师"),
                    new XElement("Weapon", "魔杖")),
                    new XElement("Sprite",
                        node2=new XElement("Profession", "战士"),
                        new XElement("Weapon", "屠龙刀")),
                        new XElement("Sprite",
                            new XElement("Profession", "道士"),
                            element = new XElement("Weapon", "倚天剑")));
            //当前节点的下一级元素中第一个名为Sprite的元素
            XElement CurrentElement = SpritesForeach2.Element("Sprite");
            Console.WriteLine("当前节点的下一级元素中第一个名为Sprite的元素:\n{0}",CurrentElement);
            //当前节点所有下级节点
            Console.WriteLine("当前节点所有下级节点:");
            foreach (var n in CurrentElement.Nodes())
            {
                Console.WriteLine(n);
            }
            //当前节点所有的后代节点
            Console.WriteLine("当前节点所有的后代节点:");
            foreach (var n in CurrentElement.Descendants())
            {
                Console.WriteLine("元素名:{0}",n.Name);
                Console.WriteLine(n);
                Console.WriteLine("--------------------------------");
            }

            //---------------------------------------------
            //建立节点
            XNode node3;
            //建立元素
            XElement element3;
            //建立xml数据源

            XElement SpritesForeach3 = new XElement("Sprites",
                new XElement("Sprite",
                    new XElement("Profession", "法师"),
                    new XElement("Weapon", "魔杖")),
                    new XElement("Sprite",
                        node3=new XElement("Profession", "战士"),
                        new XElement("Weapon", "屠龙刀")),
                        new XElement("Sprite",
                            new XElement("Profession", "道士"),
                            element3 = new XElement("Weapon", "倚天剑")));
            SpritesForeach3.Save(@"C:\Documents and Settings\Administrator\桌面\sp.xml");
            //当前节点的所有祖先元素
            Console.WriteLine("当前节点的所有祖先元素:");
            foreach (var e in node3.Ancestors())
            {
                Console.WriteLine("元素名:{0}", e.Name);
                Console.WriteLine(e);
                Console.WriteLine("---------------------------------");
            }
            //当前节点的所有后续节点
            Console.WriteLine("当前节点的所有后续节点:");
            foreach (var n in node3.NodesAfterSelf())
            {
                Console.WriteLine(n);
            }
            //当前节点的所有前驱节点
            Console.WriteLine("当前节点的所有前驱节点:");
            foreach (var n in node3.NodesBeforeSelf())
            {
                Console.WriteLine(n);
            }
 
            //---------------------------------------------------------------
            //建立节点
            XNode node4;
            //建立元素
            XElement element4;
            //建立xml数据源
            XElement SpritesForeach4 = new XElement("Sprites",
                new XElement("Sprite",
                    new XElement("Profession", "法师"),
                                         new XElement("Weapon", "魔杖")),
                                         new XElement("Sprite",
                                             node4=new XElement("Profession", "战士"),
                                             new XElement("Weapon", "屠龙刀")),
                                             new XElement("Sprite",
                                                 new XElement("Profession", "道士"),
                                                 element4 = new XElement("Weapon", "倚天剑")));
            //当前元素和其所有的祖先元素
            Console.WriteLine("当前元素和其所有的祖先元素:");
            foreach (var e in element4.AncestorsAndSelf())
            {
                Console.WriteLine("元素名:{0}",e.Name);
                Console.WriteLine(e);
                Console.WriteLine("----------------------------------");
            }
            //当前元素和其所有的后代元素
            Console.WriteLine("当前元素和其所有的后代元素:");
            foreach (var e in element4.DescendantsAndSelf())
            {
                Console.WriteLine("元素名:{0}", e.Name);
                Console.WriteLine(e);
                Console.WriteLine("----------------------------------");
            }


            //---------------------------------------------------------
            //建立节点
            XNode node5;
            //建立元素
            XElement element5;
            //建立xml数据源
            XElement Sprites5 = new XElement("Sprites",
                new XElement("Sprite01",
                    new XElement("Profession", "法师"),
                    new XElement("Weapon", "魔杖")),
                    new XElement("Sprite",
                        new XElement("Profession", "战士"),
                        node5 = new XElement("Weapon", "屠龙刀")),
                        element5= new XElement("Sprite",
                            new XAttribute("Profession", "道士"),
                            new XAttribute("Weapon", "倚天剑")));
            //添加为最后一个子节点
            Sprites5.Add(new XElement("Sprite",
                new XAttribute("Profession", "猎人"),
                new XAttribute("Weapon", "弓箭")
                ));
            //添加为第一个子节点
            Sprites5.AddFirst(new XElement("Sprite",
                new XAttribute("Profession", "骑士"),               
                new XAttribute("Weapon", "方天画戟")
                ));
            //删除子节点
            Sprites5.Element("Sprite01").RemoveNodes();
            Console.WriteLine(Sprites5);

            //-----------------------------------------------------
            Console.WriteLine("\r\n***********************************************");
            //建立节点
            XNode node6;
            //建立元素
            XElement element6;
            //建立xml数据源
            XElement Sprites6 = new XElement("Sprites",
                new XElement("Sprite01",
                    new XElement("Profession", "法师"),
                    new XElement("Weapon", "魔杖")),
                    new XElement("Sprite",
                        new XElement("Profession", "战士"),
                        node6 = new XElement("Weapon", "屠龙刀")),
                        element6= new XElement("Sprite",
                            new XAttribute("Profession", "道士"),
                            new XAttribute("Weapon", "倚天剑")));
            //添加为自身节点的前一个节点
            node6.AddBeforeSelf(new XElement("Weapon", "雪饮刀"));
            //添加为自身节点的后一个节点
            node6.AddAfterSelf(new XElement("Weapon", "狼牙棒"));
            //删除自身节点
            Sprites6.FirstNode.Remove();
            Console.WriteLine(Sprites6);

            //-------------------------------------------------------
            Console.WriteLine("\r\n ***********************************************************");
            //建立节点
            XNode node7;
            //建立元素
            XElement element7;
            //建立xml数据源
            XElement Sprites7 = new XElement("Sprites",
                new XElement("Sprite01",
                    new XElement("Profession", "法师"),
                    new XElement("Weapon", "魔杖")),
                    new XElement("Sprite",
                        new XElement("Profession", "战士"),
                        node7 = new XElement("Weapon", "屠龙刀")),
                        element7= new XElement("Sprite",
                            new XAttribute("Profession", "道士"),
                            new XAttribute("Weapon", "倚天剑")));
            //Name属性修改
            Sprites7.Element("Sprite01").Name="Sprite";
            //Value属性修改
            element7.Attribute("Weapon").Value="火麟剑";
            //或
            //element.SetAttributeValue("Weapon", "火麟剑");
            //删除元素属性
            element7.RemoveAttributes();
            //或
            //删除自身所有子节点和属性
            //element.RemoveAll();
            Console.WriteLine(Sprites7);

            //---------------------------------------------------------
            Console.WriteLine("\r\n ***********************************************************");
            //读取xml文件
            XElement xml8 = XElement.Load("D:\\Sprites3.xml");
            //查询所有元素名为Sprite的元素
            var sprites8 = from s in xml.Descendants("Sprite")
                          select new {
                              Profession = s.Element("Profession").Value,
                              Weapon=s.Element("Weapon").Value
                          };
            //输出sprites信息
            foreach (var s in sprites8)
            {
                Console.WriteLine("精灵职业:{0}",s.Profession);
                Console.WriteLine("主要武器:{0}",s.Weapon);
                Console.WriteLine("----------------------------------------");
            }
 
            Console.Read();

posted on 2011-10-01 15:33  上校  阅读(290)  评论(0)    收藏  举报