Linq To XMl
啥是Linq To Xml呢?
Linq To Xml就是通过Linq语句来快速检索Xml树或Xml文件,并从中获取相应的记录或对获取的记录进行相应的操作。用Linq来检索Xml文件比Xpath好用,用Linq来操作Xml文件比DOM好用。Linq To Xml 说白了就是Xpath和DOM的抽象,语法简单但功能却不简单。
废话不多说呀,咱来写几个案例。
案例1 如何使用Linq创建一个Xml文件
Xelement root=new Xelement(“Root”, New Xelement(“Child1”), New Xelement(“Child2”), New Xelement(“Child3”), New Xelement(“Child4”, New Xelement(“GrandChild1”), New Xelement(“GrandChild2”) )//child4 )//root Root.Save(“C:/MyTree.xml”);
只需这样,咱们就轻松的建立了一颗Xml树,它的结构如下:
<Root> <Child1></ Child1> <Child2></ Child2> <Child3></ Child3> <Child4> <GrandChild1></ GrandChild 1> <GrandChild2></ GrandChild 2> </ Child4> </Root>
如何用Linq从Xml树中获取相应的信息呢?接下来咱们对下面这颗xml数进行信息检索
<?xml version="1.0" encoding="utf-8"?> <MemoRoot> <Memo> <ID>41</ID> <MemoUser>ghostbear</MemoUser> <MemoContent>去家里洗澡燥</MemoContent> <MemoCreateTime>2011-02-13T20:31:45.453</MemoCreateTime> <MemoContentApplyTime>2011-02-14T00:00:00</MemoContentApplyTime> </Memo> <Memo> <ID>42</ID> <MemoUser>ghostbear</MemoUser> <MemoContent>去干洗店拿衣服</MemoContent> <MemoCreateTime>2011-02-13T20:32:06.203</MemoCreateTime> <MemoContentApplyTime>2011-02-14T00:00:00</MemoContentApplyTime> </Memo> <Memo> <ID>43</ID> <MemoUser>ghostbear</MemoUser> <MemoContent>回奶奶家继续研究Linq</MemoContent> <MemoCreateTime>2011-02-13T20:32:21.343</MemoCreateTime> <MemoContentApplyTime>2011-02-14T00:00:00</MemoContentApplyTime> </Memo> <Memo> <ID>44</ID> <MemoUser>ghostbear</MemoUser> <MemoContent>去姐姐家看望姐姐</MemoContent> <MemoCreateTime>2011-02-13T20:32:36.89</MemoCreateTime> <MemoContentApplyTime>2011-02-15T00:00:00</MemoContentApplyTime> </Memo> <Memo important=”true”> <ID>45</ID> <MemoUser>ghostbear</MemoUser> <MemoContent>打电话给中兴,说我不去培训</MemoContent> <MemoCreateTime>2011-02-13T20:33:11.39</MemoCreateTime> <MemoContentApplyTime>2011-02-14T00:00:00</MemoContentApplyTime> </Memo> <Memo> <ID>46</ID> <MemoUser>ghostbear</MemoUser> <MemoContent>去郭青店里玩玩</MemoContent> <MemoCreateTime>2011-02-13T20:33:39.563</MemoCreateTime> <MemoContentApplyTime>2011-02-16T00:00:00</MemoContentApplyTime> </Memo> <Memo> <ID>47</ID> <MemoUser>ghostbear</MemoUser> <MemoContent>去买19号的车票 </MemoContent> <MemoCreateTime>2011-02-13T20:34:50.64</MemoCreateTime> <MemoContentApplyTime>2011-02-17T00:00:00</MemoContentApplyTime> </Memo> <Memo> <ID>48</ID> <MemoUser>ghostbear</MemoUser> <MemoContent>回家呆呆</MemoContent> <MemoCreateTime>2011-02-13T20:35:13.907</MemoCreateTime> <MemoContentApplyTime>2011-02-18T00:00:00</MemoContentApplyTime> </Memo> <Memo> <ID>49</ID> <MemoUser>ghostbear</MemoUser> <MemoContent>坐车回学校咯</MemoContent> <MemoCreateTime>2011-02-13T20:35:28.407</MemoCreateTime> <MemoContentApplyTime>2011-02-19T00:00:00</MemoContentApplyTime> </Memo> <Memo important=”true”> <ID>50</ID> <MemoUser>ghostbear</MemoUser> <MemoContent>把存单给大姨</MemoContent> <MemoCreateTime>2011-02-17T13:56:20.827</MemoCreateTime> <MemoContentApplyTime>2011-02-18T00:00:00</MemoContentApplyTime> </Memo> </MemoRoot>
案例2 获取ID值介于40~45之间的Memo节点
Xelement root=Xelement.Load(“C:/MyTree.xml”); Var result=from memo in root.Descendants(“Memo”) Let id= int.parse(memo.Element(“ID”).Value) Where id>=40 && id<=45 Select memo Foreach(Xelement e in memo) Console.writeline(e.element(“ID”).Value+”/n”); 结果为: 41 42 43 44 45
案例3 获取属性Important=true的Memo节点
Xelement memo=Xelement.Load(“C:/MyTree.xml”); Var result=from m in memo.Descendants(“Memo”) Where m.Attribute[“important”]!=null && m.Attribute[“important”].Value==”true” Select m; Foreach(Xelement e in result) Console.WriteLine(e.Element(“ID”).Value); 结果为: 45 50
案例4 如何通过Linq使用节点的命名空间来检索信息
<?xml version="1.0" encoding="gb2312" ?> <root xmlns:bd="www.baidu.com" xmlns:gl="www.google.com"> <bd:website> <name>百度</name> <url>http://www.baidu.com</url> <port>80</port> </bd:website> <gl:website> <name>谷歌</name> <url>http://www.google.com</url> <port>80</port> </gl:website> <website> <name>搜狗</name> <url>http://www.sougou.com</url> <port>80</port> </website> </root>
咱们用这颗Xml树来测试
XElement myTree = XElement.Load("../../TestNamespace.xml"); var result1 = myTree.Descendants(XName.Get("website", "www.baidu.com")); var result2 = myTree.Descendants(XName.Get("website","www.google.com")); var result3 = myTree.Descendants("website"); foreach (XElement e in result1) { Console.WriteLine(e.Element("name").Value); } foreach (XElement e in result2) { Console.WriteLine(e.Element("name").Value); } foreach (XElement e in result3) { Console.WriteLine(e.Element("name").Value); } 结果为: 百度 谷歌 搜狗
案例5 Xml文件的序列化
Xml文件的序列化可以让文件更小,传输更便捷。咱们用案例1的Xml树来操作。 Xelement root=new Xelement(“Root”, New Xelement(“Child1”), New Xelement(“Child2”), New Xelement(“Child3”), New Xelement(“Child4”, New Xelement(“GrandChild1”), New Xelement(“GrandChild2”) )//child4 )//root Root.Save(“C:/MyTree.xml”,SaveOptions.DisableFormatting);