linq to xml fagdag fredag, 20.november 2009. in-memory xml programming interface gamle-måten: ...

28
LINQ to XML Fagdag Fredag, 20.november 2009

Upload: celeste-homsey

Post on 11-Dec-2015

226 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: LINQ to XML Fagdag Fredag, 20.november 2009. In-memory XML programming interface Gamle-måten:  XmlDocument / DOM  XPath  XQuery Med LINQ:  XDocument

LINQ to XML

FagdagFredag, 20.november 2009

Page 2: LINQ to XML Fagdag Fredag, 20.november 2009. In-memory XML programming interface Gamle-måten:  XmlDocument / DOM  XPath  XQuery Med LINQ:  XDocument

In-memory XML programming interface

Gamle-måten: XmlDocument / DOM XPath XQuery

Med LINQ: XDocument / XElement LINQ query expressions

Fagdag, 20.november 2009 Side 2

Hva er LINQ to XML?

Page 3: LINQ to XML Fagdag Fredag, 20.november 2009. In-memory XML programming interface Gamle-måten:  XmlDocument / DOM  XPath  XQuery Med LINQ:  XDocument

Hvorfor LINQ to XML?

“Lettere” objektmodell enn DOM Enklere syntax Drar nytte av språkforbedringer i C# LINQ er integrert i (C# 2008): Intellisens Sterkere typing Compile-time sjekking Bedre debugger-støtte Functional construction (XElement,XAttribute)

Fagdag, 20.november 2009 Side 3

Page 4: LINQ to XML Fagdag Fredag, 20.november 2009. In-memory XML programming interface Gamle-måten:  XmlDocument / DOM  XPath  XQuery Med LINQ:  XDocument

Lese XML inn i minnet

XDocument.Load("Books.xml");

XElement.Load("Books.xml");

Fagdag, 20.november 2009 Side 4

Page 5: LINQ to XML Fagdag Fredag, 20.november 2009. In-memory XML programming interface Gamle-måten:  XmlDocument / DOM  XPath  XQuery Med LINQ:  XDocument

Lese XML inn i minnet

XElement.Load(”http://somersslocation/rss.aspx");

Fagdag, 20.november 2009 Side 5

Page 6: LINQ to XML Fagdag Fredag, 20.november 2009. In-memory XML programming interface Gamle-måten:  XmlDocument / DOM  XPath  XQuery Med LINQ:  XDocument

Lese XML inn i minnet

XElement.Load(XmlReader);

XElement.Load(TextReader);

Fagdag, 20.november 2009 Side 6

Page 7: LINQ to XML Fagdag Fredag, 20.november 2009. In-memory XML programming interface Gamle-måten:  XmlDocument / DOM  XPath  XQuery Med LINQ:  XDocument

Skrive til fil

XDocument xDoc = XDocument.Load("Books.xml");

xDoc.Save("Books2.xml");

XElement xElem = XElement.Load("Books.xml");

xElem.Save("Books2.xml");

Fagdag, 20.november 2009 Side 7

Page 8: LINQ to XML Fagdag Fredag, 20.november 2009. In-memory XML programming interface Gamle-måten:  XmlDocument / DOM  XPath  XQuery Med LINQ:  XDocument

Skrive til stream

StringBuilder output = new StringBuilder(); XmlWriterSettings xmlWriterSettings = new XmlWriterSettings {OmitXmlDeclaration = true};

using (XmlWriter writer = XmlWriter.Create(output, xmlWriterSettings)) { XElement root = myXElement; root.Save(writer); }

Fagdag, 20.november 2009 Side 8

Page 9: LINQ to XML Fagdag Fredag, 20.november 2009. In-memory XML programming interface Gamle-måten:  XmlDocument / DOM  XPath  XQuery Med LINQ:  XDocument

Konstruere xml

XElement xml = new XElement("contacts”, new XElement("contact”, new XAttribute("contactId", "2"), new XElement(”name", ”Homer Simpson”) ), new XElement("contact”, new XAttribute("contactId", "3"), new XElement(”name", ”Mr. Burns")

)

);

xml.Save(”contacts.xml”);

Fagdag, 20.november 2009 Side 9

Page 10: LINQ to XML Fagdag Fredag, 20.november 2009. In-memory XML programming interface Gamle-måten:  XmlDocument / DOM  XPath  XQuery Med LINQ:  XDocument

Contacts.xml

<contacts> <contact contactId="2"> <name>Homer Simpson</name> </contact> <contact contactId="3"> <name>Mr. Burns</name> </contact>

</contacts>

Fagdag, 20.november 2009 Side 10

Page 11: LINQ to XML Fagdag Fredag, 20.november 2009. In-memory XML programming interface Gamle-måten:  XmlDocument / DOM  XPath  XQuery Med LINQ:  XDocument

Manipulere xml: Add

xElement.Add(new XElement("NewChild", "new content") );

AddFirst, AddAfterSelf, AddBeforeSelf

xElement.Add(new XAttribute("NewAttribute", "attr content”) );

Fagdag, 20.november 2009 Side 11

Page 12: LINQ to XML Fagdag Fredag, 20.november 2009. In-memory XML programming interface Gamle-måten:  XmlDocument / DOM  XPath  XQuery Med LINQ:  XDocument

Manipulere xml: Set Element

xElement.Parse(”<NewElement>value</NewElement>");

ReplaceAll

SetElementValue

Value

SetValue

ReplaceWith( someOtherElement )

ReplaceNodes( otherElements )

Fagdag, 20.november 2009 Side 12

Page 13: LINQ to XML Fagdag Fredag, 20.november 2009. In-memory XML programming interface Gamle-måten:  XmlDocument / DOM  XPath  XQuery Med LINQ:  XDocument

Manipulere xml: Set Attribute

xElement.ReplaceAttributes(new XAttribute("attrName", "value"));

SetAttributeValue

Value

SetValue

Fagdag, 20.november 2009 Side 13

Page 14: LINQ to XML Fagdag Fredag, 20.november 2009. In-memory XML programming interface Gamle-måten:  XmlDocument / DOM  XPath  XQuery Med LINQ:  XDocument

Manipulere xml: Remove element

xElement.Remove();

xElement.RemoveNodes();

xElement.RemoveAll();

xElement.Remove();

xElement.SetValue(null);

Fagdag, 20.november 2009 Side 14

Page 15: LINQ to XML Fagdag Fredag, 20.november 2009. In-memory XML programming interface Gamle-måten:  XmlDocument / DOM  XPath  XQuery Med LINQ:  XDocument

Manipulere xml: Remove attribute

xElement.Remove();

xElement.Attribute("someAttribute").Remove();

xElement.RemoveAttributes();

xElement.RemoveAll();

xElement.SetAttributeValue("someAttribute", null);

Fagdag, 20.november 2009 Side 15

Page 16: LINQ to XML Fagdag Fredag, 20.november 2009. In-memory XML programming interface Gamle-måten:  XmlDocument / DOM  XPath  XQuery Med LINQ:  XDocument

Spørringer

<?xml version="1.0" encoding="utf-8" ?>

<Feeds>

<Feed>

<Name>ScottGu Blog</Name>

<Url>http://weblogs.asp.net/scottgu/rss.aspx</Url>

</Feed>

<Feed>

<Name>Weblogs.ASP.NET Main Feed</Name>

<Url>http://weblogs.asp.net/MainFeed.aspx</Url>

</Feed>

<Feed status="disabled”>

<Name>Bozo Blog</Name>

<Url>http://somesite.com/bozo.rss</Url>

</Feed>

</Feeds>

Fagdag, 20.november 2009 Side 16

Page 17: LINQ to XML Fagdag Fredag, 20.november 2009. In-memory XML programming interface Gamle-måten:  XmlDocument / DOM  XPath  XQuery Med LINQ:  XDocument

Spørringer

var allElementsInXml = from element in rssXml.Descendants() select element;

Fagdag, 20.november 2009 Side 17

Page 18: LINQ to XML Fagdag Fredag, 20.november 2009. In-memory XML programming interface Gamle-måten:  XmlDocument / DOM  XPath  XQuery Med LINQ:  XDocument

Spørringer

var feedUrls = from url in rssXml.Descendants("Url")

select url;

Fagdag, 20.november 2009 Side 18

Page 19: LINQ to XML Fagdag Fredag, 20.november 2009. In-memory XML programming interface Gamle-måten:  XmlDocument / DOM  XPath  XQuery Med LINQ:  XDocument

Spørringer

var disabledFeeds = from feed in rssXml.Descendants("Feed")

where (feed.Attribute("status")!= null

&& feed.Attribute("status").Value.Equals("disabled"))

select feed.Descendants("Url");

Fagdag, 20.november 2009 Side 19

Page 20: LINQ to XML Fagdag Fredag, 20.november 2009. In-memory XML programming interface Gamle-måten:  XmlDocument / DOM  XPath  XQuery Med LINQ:  XDocument

Spørringer

var feeds = from feed in rssXml.Descendants("Feed")

where feed.Attribute("status") == null ||

feed.Attribute("status").Value != "disabled"

select new FeedDefinition

{

Name = feed.Element("Name").Value,

Url = feed.Element("Url").Value

};

IList<FeedDefinition> feedList = feeds.ToList();

Fagdag, 20.november 2009 Side 20

Page 21: LINQ to XML Fagdag Fredag, 20.november 2009. In-memory XML programming interface Gamle-måten:  XmlDocument / DOM  XPath  XQuery Med LINQ:  XDocument

Spørringer

<Feed>

<Name>ScottGu Blog</Name>

<Url>http://weblogs.asp.net/scottgu/rss.aspx</Url>

<Tag>.net</Tag>

<Tag>LINQ</Tag>

<Tag>VS2008</Tag>

</Feed>

Fagdag, 20.november 2009 Side 21

Page 22: LINQ to XML Fagdag Fredag, 20.november 2009. In-memory XML programming interface Gamle-måten:  XmlDocument / DOM  XPath  XQuery Med LINQ:  XDocument

Spørringer: sub-queries

var feeds = from feed in rssXml.Descendants("Feed")

select new FeedDefinition

{

Name = feed.Element("Name").Value,

Url = feed.Element("Url").Value,

Tags = (from tag in feed.Elements("Tag")

orderby tag.Value

select tag.Value).ToList()

};

Fagdag, 20.november 2009 Side 22

Page 23: LINQ to XML Fagdag Fredag, 20.november 2009. In-memory XML programming interface Gamle-måten:  XmlDocument / DOM  XPath  XQuery Med LINQ:  XDocument

Validere mot XmlSchema

XmlSchemaSet schemas = new XmlSchemaSet(); schemas.Add(”MyTargetNameSpace", ”MyXmlSchema.xsd");

xmlDocument.Validate(schemas, MyValidationEventHandler);

Fagdag, 20.november 2009 Side 23

Page 24: LINQ to XML Fagdag Fredag, 20.november 2009. In-memory XML programming interface Gamle-måten:  XmlDocument / DOM  XPath  XQuery Med LINQ:  XDocument

Tips: Refaktorer komplekse spørringer

var feeds = from feed in rssXml.Descendants("Feed“) select new FeedDefinition {

Name = feed.Element("Name").Value,Url = feed.Element("Url").Value, Tags = GetTags(feed)

};

private IList<string> GetTags( XElement feed ){ var tags = from tag in feed.Elements("Tag”) orderby tag.Value select tag.Value; return tags.ToList();

}

Fagdag, 20.november 2009 Side 24

Page 25: LINQ to XML Fagdag Fredag, 20.november 2009. In-memory XML programming interface Gamle-måten:  XmlDocument / DOM  XPath  XQuery Med LINQ:  XDocument

Andre tips & triks

Bruk lambda-uttrykk i spørringer Count vs Any Avg er følsomt for lange elementlister

Cast til list for å fjerne IQueryable-context

Fagdag, 20.november 2009 Side 25

Page 26: LINQ to XML Fagdag Fredag, 20.november 2009. In-memory XML programming interface Gamle-måten:  XmlDocument / DOM  XPath  XQuery Med LINQ:  XDocument

Ressurser

http://www.hookedonlinq.com/LINQtoXML5MinuteOverview.ashx

http://en.wikipedia.org/wiki/Linq

http://weblogs.asp.net/scottgu/archive/2007/08/07/using-linq-to-xml-and-how-to-build-a-custom-rss-feed-reader-with-it.aspx

http://msdn.microsoft.com/en-us/library/bb387098.aspx

Fagdag, 20.november 2009 Side 26

Page 27: LINQ to XML Fagdag Fredag, 20.november 2009. In-memory XML programming interface Gamle-måten:  XmlDocument / DOM  XPath  XQuery Med LINQ:  XDocument

Spørsmål?

Fagdag, 20.november 2009 Side 27

Page 28: LINQ to XML Fagdag Fredag, 20.november 2009. In-memory XML programming interface Gamle-måten:  XmlDocument / DOM  XPath  XQuery Med LINQ:  XDocument

BEKK CONSULTING ASSKUR 39, VIPPETANGEN. P.O. BOX 134 SENTRUM, 0102 OSLO. WWW.BEKK.NO