LING TO XML

命名空间

XNamespace aw = "http://www.adventure-works.com";

            XElement root = new XElement(aw + "Root",

                new XAttribute("aw", "http://www.adventure-works.com"),

                "Content");

            Console.WriteLine(root);

 

使用 LINQ to XML 时,仅在文档的根级别添加注释或处理说明时,才需使用 XDocument 类。

                XDocument srcTree = new XDocument(

                new XComment("This is a comment"),

                new XElement("Root",

                    new XElement("Child1", "data1"),

                    new XElement("Child2", "data2"),

                    new XElement("Child3", "data3"),

                    new XElement("Child2", "data4"),

                    new XElement("Info5", "info5"),

                    new XElement("Info6", "info6"),

                    new XElement("Info7", "info7"),

                    new XElement("Info8", "info8")

                )

            );

//注意element可以直接强转成对应的值

 

初始化 最常用的两种方法

一种是上面那种,另外一种使用 LINQ 查询的结果来填充 XML 树

XElement srcTree = new XElement("Root",  

    new XElement("Element", 1),  

    new XElement("Element", 2),  

    new XElement("Element", 3),  

    new XElement("Element", 4),  

    new XElement("Element", 5)  

);  

XElement xmlTree = new XElement("Root",  

    new XElement("Child", 1),  

    new XElement("Child", 2),  

    from el in srcTree.Elements()  

    where (int)el > 2  

    select el  

);  

Console.WriteLine(xmlTree);

 

序列化的时候留白

string str;

            XElement root = XElement.Parse(@"<Root> <Child> Text </Child> </Root>");

 

            root.Save("Root.xml", SaveOptions.DisableFormatting);

            str = File.ReadAllText("Root.xml");

            Console.WriteLine(str);

 

            Console.WriteLine("=====");

 

            root.Save("Root.xml", SaveOptions.None);

            str = File.ReadAllText("Root.xml");

            Console.WriteLine(str);

正常输出XML内容的时候是自带XML声明的

下面演示 输出时不自带XML声明的例子

StringBuilder sb = new StringBuilder();

            XmlWriterSettings xws = new XmlWriterSettings();

            xws.OmitXmlDeclaration = true;

 

            using (XmlWriter xw = XmlWriter.Create(sb, xws))

            {

                XElement root = new XElement("Root",

                    new XElement("Child",

                    new XElement("c1","c1"),

                    new XElement("c2","c2"))

                );

                root.Save(xw);

            }

            Console.WriteLine(sb.ToString());

 

循环所有节点的名称

string path = Path.Combine(Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName, @"static\PurchaseOrder.xml");

            XElement xe = XElement.Load(path);

            foreach(var i in xe.Elements())

            {

                Console.WriteLine(i.Name);

            }

 

检索元素的值

只需将 XElement 对象强制转换为所需的类型即可。 任何时候都可以将元素强制转换为字符串

XElement xe = new XElement("nodename","nodevalue");

            Console.WriteLine("name is  "+xe.Name+"    value  si   "+(string)xe);

 

有的时候节点可能存在或者不存在,使用的时候我们需要检查

string c1 = (string)root.Element("Child1");

            Console.WriteLine("c1:{0}", c1 == null ? "element does not exist" : c1);

 

            int? c2 = (int?)root.Element("Child2");

            Console.WriteLine("c2:{0}", c2 == null ? "element does not exist" : c2.ToString());

 

获取指定名称的所有节点

Descendants("ProductName")

 

查找所有 PurchaseOrder 元素中的所有 Address 元素Name元素的值

IEnumerable<XElement> names =

from el in purchaseOrders .Elements("PurchaseOrder") .Elements("Address") .Elements("Name") select el;

foreach (XElement e in names) Console.WriteLine(e);

 

创建包含指定元素属性的节点

XElement val = new XElement("Value", new XAttribute("ID", "1243"), new XAttribute("Type", "int"), new XAttribute("ConvertableTo", "double"), "100"); IEnumerable<XAttribute> listOfAttributes = from att in val.Attributes() select att; foreach (XAttribute a in listOfAttributes) Console.WriteLine(a);

或者

 XElement val = new XElement("Value",

    new XAttribute("ID", "1243"),

    new XAttribute("Type", "int"),

    new XAttribute("ConvertableTo", "double"),

new XElement("v1","v1"),new XElement("v2","v2"));

 

循环

var e=XElement.Load(path);

            foreach(var attr in e.Attributes())

            {

                //Console.WriteLine((string)attr);// value

                //Console.WriteLine(attr);  //XX="XX"

                Console.WriteLine(attr.Name+"   "+attr.Value);

            }

 

检索单个属性

XElement cust = new XElement("PhoneNumbers", new XElement("Phone", new XAttribute("type", "home"), "555-555-5555"), new XElement("Phone", new XAttribute("type", "work"), "555-555-6666") ); IEnumerable<XElement> elList = from el in cust.Descendants("Phone") select el; foreach (XElement el in elList) Console.WriteLine((string)el.Attribute("type"));

 

 

 

elements Descendants 之间的区别

elements 只能查询根节点下面次一级的节点

Descendants 可以直接查询根节点下面想要的节点

 

计算中间值

 

XElement root = XElement.Load("Data.xml"); IEnumerable<decimal> extensions = from el in root.Elements("Data") let extension = (decimal)el.Element("Quantity") * (decimal)el.Element("Price") where extension >= 25 orderby extension select extension; foreach (decimal ex in extensions) Console.WriteLine(ex);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值