LINQ?
Har en xmlfil enligt nedan och vill hämta ut ett värde från en bestämd node, nämligen TEST2 med type=X
<HEADER>
<TEST1>1</TEST1>
<TEST2 type="X">test2>/TEST2>
<TEST2 type="Y">test3>/TEST2>
</HEADER>
Hur ser det ut i C# om jag använder mig System.Xml.Linq.XDocument XMLDoc = System.Xml.Linq.XDocument.Load(XMLFILE);
Svara
Sv: LINQ?
1 2 3 4 5 6 7 8 9 10 11 12 13 | var xml = @"<HEADER> <TEST1>1</TEST1> <TEST2 type=""X"">test2</TEST2> <TEST2 type=""Y"">test3</TEST2> </HEADER>" ; var doc = XDocument.Parse(xml); var valuesOfTest2OfTypeX = from item in doc.Descendants( "TEST2" ) where item.Attribute( "type" ).Value == "X" select item.Value; foreach (var value in valuesOfTest2OfTypeX) { Console.WriteLine(value); } |
Svara
Sv:LINQ?
Tack det funkar bra!
Men om man lägger till följande värde i <HEAD xmlns=""http://www.test.no/XMLSchema"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xsi:schemaLocation=""http://www.test.no/XMLSchema test_v3p3.xsd"">
Då funkar det inte, hur kan jag kringå det?
Svara
Sv: LINQ?
Om du deklarerar ett namespace måste du använda det också när du refererar till noderna:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | var xml = @"<HEADER xmlns=""http://www.test.no/XMLSchema"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xsi:schemaLocation=""http://www.test.no/XMLSchema test_v3p3.xsd""> <TEST1>1</TEST1> <TEST2 type=""X"">test2</TEST2> <TEST2 type=""Y"">test3</TEST2> </HEADER>" ; var doc = XDocument.Parse(xml); var valuesOfTest2OfTypeX = from item in doc.Descendants(ns + "TEST2" ) where item.Attribute( "type" ).Value == "X" select item.Value; foreach (var value in valuesOfTest2OfTypeX) { Console.WriteLine(value); } } |
Det finns inget sätt (så vitt jag vet iaf) att sätta default namespace på XDocument, utan det blir nog till att alltid komma ihåg att köra
1 | doc.Descendants(ns + nodnamn) |
Alternativt trixxa ihop en egen extension eller så förstås
Svara
Sv: LINQ?
Kom på en sak till, säg att det värdet som jag precis plockade ut, det vill jag nu uppdatera med ett nytt till xml filen.
Funkar det?
Svara
Sv:LINQ?
Japp, fast det kommer bli i två "steg". Selektera ut det som ska pillas på, och sen (iterera över det och) pilla på det.
1 2 3 4 5 | foreach (var descendant in doc.Descendants(ns + "TEST2" ).Where(d => d.Attribute( "type" ).Value == "X" )) // steg 1 descendant.Value += " och så ett nytt värde" ; // steg 2 // för att få ner ändringarna på disk doc.Save( "kalle.xml" ); |
Svara