LINQ to XML
FagdagFredag, 20.november 2009
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?
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
Lese XML inn i minnet
XDocument.Load("Books.xml");
XElement.Load("Books.xml");
Fagdag, 20.november 2009 Side 4
Lese XML inn i minnet
XElement.Load(”http://somersslocation/rss.aspx");
Fagdag, 20.november 2009 Side 5
Lese XML inn i minnet
XElement.Load(XmlReader);
XElement.Load(TextReader);
Fagdag, 20.november 2009 Side 6
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
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
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
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
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
Manipulere xml: Set Element
xElement.Parse(”<NewElement>value</NewElement>");
ReplaceAll
SetElementValue
Value
SetValue
ReplaceWith( someOtherElement )
ReplaceNodes( otherElements )
Fagdag, 20.november 2009 Side 12
Manipulere xml: Set Attribute
xElement.ReplaceAttributes(new XAttribute("attrName", "value"));
SetAttributeValue
Value
SetValue
Fagdag, 20.november 2009 Side 13
Manipulere xml: Remove element
xElement.Remove();
xElement.RemoveNodes();
xElement.RemoveAll();
xElement.Remove();
xElement.SetValue(null);
Fagdag, 20.november 2009 Side 14
Manipulere xml: Remove attribute
xElement.Remove();
xElement.Attribute("someAttribute").Remove();
xElement.RemoveAttributes();
xElement.RemoveAll();
xElement.SetAttributeValue("someAttribute", null);
Fagdag, 20.november 2009 Side 15
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
Spørringer
var allElementsInXml = from element in rssXml.Descendants() select element;
Fagdag, 20.november 2009 Side 17
Spørringer
var feedUrls = from url in rssXml.Descendants("Url")
select url;
Fagdag, 20.november 2009 Side 18
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
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
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
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
Validere mot XmlSchema
XmlSchemaSet schemas = new XmlSchemaSet(); schemas.Add(”MyTargetNameSpace", ”MyXmlSchema.xsd");
xmlDocument.Validate(schemas, MyValidationEventHandler);
Fagdag, 20.november 2009 Side 23
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
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
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
Spørsmål?
Fagdag, 20.november 2009 Side 27
BEKK CONSULTING ASSKUR 39, VIPPETANGEN. P.O. BOX 134 SENTRUM, 0102 OSLO. WWW.BEKK.NO