linq to xml入门

一、简介

LINQ to XML 是一种启用了 LINQ 的内存 XML 编程接口,使用它,可以在 .NET Framework 编程语言中处理 XML。 它将 XML 文档置于内存中,这一点很像文档对象模型 (DOM)。 您可以查询和修改 XML 文档,修改之后,可以将其另存为文件,也可以将其序列化然后通过网络发送。 但是,LINQ to XML 与 DOM 不同: 它提供一种新的对象模型,这是一种更轻量的模型,使用也更方便,这种模型利用了 Visual C# 2008 在语言方面的改进。

LINQ to XML 最重要的优势是它与 Language-Integrated Query (LINQ) 的集成。 由于实现了这一集成,因此,可以对内存 XML 文档编写查询,以检索元素和属性的集合。 LINQ to XML 的查询功能在功能上(尽管不是在语法上)与 XPath 和 XQuery 具有可比性。 Visual C# 2008 集成 LINQ 后,可提供更强的类型化功能、编译时检查和改进的调试器支持。

通过将查询结果用作 XElement 和 XAttribute 对象构造函数的参数,实现了一种功能强大的创建 XML 树的方法。 这种方法称为“函数构造”,利用这种方法,开发人员可以方便地将 XML 树从一种形状转换为另一种形状。

二、载入文档

可以通过XDocument或XElement的静态方法Load载入xml文档,Load可以接受URI字符串,TextReader,XmlReader作为输入源。还可以使用静态方法Parse把字符串转变为待查询的xml文档。XDocument和XElement的区别在于查询时,XElment可以跳过根几点直接查询。

//从文件载入
XDocument myPets = XDocument.Load("MyPets.xml");
//从http载入天气预报
string weatherWebService = "http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName?theCityName=58367";
XDocument weather = XDocument.Load(weatherWebService);
XElement weatherElement = XElement.Load(weatherWebService);

三、查询XML文档

待查询的xml文档

<?xml version="1.0" encoding="utf-8"?>
<pets>
  <pet>
    <id>2</id>
    <name>Dog</name>
    <species>Some Kind of Cat</species>
    <sex>Female</sex>
    <startYear>1972</startYear>
    <endYear>1974</endYear>
    <causeOfDeath>Car</causeOfDeath>
    <specialQuality>Best mouser</specialQuality>
  </pet>
  <pet>
    <id>3</id>
    <name>Sam</name>
    <species>Labrador</species>
    <sex>Female</sex>
    <startYear>1973</startYear>
    <endYear>1980</endYear>
    <causeOfDeath>Old Age</causeOfDeath>
    <specialQuality>Great hunting dog</specialQuality>
  </pet>
</pets>

载入文档后,XDocument或XElement的Elements()方法执行时返回IEnumrable<XElement>类型的子节点信息,Element()方法返回唯一的子节点信息。

查找所有pet的name。分别使用XDocument和XElement查找。

XDocument document = XDocument.Load("MyPets.xml");
XElement element = XElement.Load("MyPets.xml");

var name = from pet in document.Elements("pets").Elements("pet")
           select pet.Element("name").Value;

var pets = from pet in element.Elements("pet")
           select pet;

Array.ForEach(pets.ToArray(), p=>Console.WriteLine(p.Element("name").Value));
Array.ForEach(name.ToArray(), n => Console.WriteLine(n));

 

四、修改XML文档

修改pet的id

XElement element = XElement.Load("MyPets.xml");
var query = from pet in element.Elements("pet")
            select pet.Element("id");
foreach (var id in query)
{
    id.Value = Guid.NewGuid().ToString();
}
element.Save("NewPets.xml");

添加节点到owner到pet

XElement element = XElement.Load("MyPets.xml");
var query = from pet in element.Elements("pet")
            select pet;
foreach (var p in query)
{
    XElement owner = new XElement("owner", "mshijie");
    p.Add(owner);
}
element.Save("NewPets.xml");

 

删除节点

var query = from pet in element.Elements("pet")
            select pet;
foreach (var p in query)
{
    p.Element("owner").Remove();
}
element.Save("NewPets.xml");

五、访问节点属性

XElement element = XElement.Load("MyPets.xml");
var query = from pet in element.Elements("pet")
            select pet;
foreach (var p in query)
{
    XAttribute attr = new XAttribute("size", "small");
    p.Add(attr);//添加属性

    p.Attribute("size").Remove();//删除属性
                   
}
element.Save("NewPets.xml");

六、创建xml文档

XElement contacts =
  new XElement("Contacts",
      new XElement("Contact",
          new XElement("Name", "Patrick Hines"),
          new XElement("Phone", "206-555-0144",
              new XAttribute("Type", "Home")),
          new XElement("phone", "425-555-0145",
              new XAttribute("Type", "Work")),
          new XElement("Address",
              new XElement("Street1", "123 Main St"),
              new XElement("City", "Mercer Island"),
              new XElement("State", "WA"),
              new XElement("Postal", "68042")
          )
      )
  );

XElement构造函数接受两个参数,节点名和Content,Content可以是简单字符串,也可以的属性和子节点集合。

七、处理命名空间

创建带命名空间的xml文档

XNamespace myns = "http://www.cnblogs.com/mshijie";

XElement root = new XElement(myns + "pets",
                    new XAttribute(XNamespace.Xmlns + "myns", myns),
                    new XElement(myns + "pet",
                        new XElement(myns + "name", "Dog")));
root.Save("test.xml");

test.xml

<?xml version="1.0" encoding="utf-8"?>
<myns:pets xmlns:myns="http://www.cnblogs.com/mshijie">
  <myns:pet>
    <myns:name>Dog</myns:name>
  </myns:pet>
</myns:pets>

查询

XNamespace myns = "http://www.cnblogs.com/mshijie";
XElement pets = XElement.Load("test.xml");

var query = from pet in pets.Elements(myns + "pet")
            select pet;

Array.ForEach(query.ToArray(), p => Console.WriteLine(p.Element(myns + "name").Value));

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值