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 Tack det funkar bra! Om du deklarerar ett namespace måste du använda det också när du refererar till noderna: 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. Japp, fast det kommer bli i två "steg". Selektera ut det som ska pillas på, och sen (iterera över det och) pilla på det.LINQ?
<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);Sv: LINQ?
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);
}
Sv:LINQ?
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?Sv: LINQ?
var ns = XNamespace.Get("http://www.test.no/XMLSchema");
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
doc.Descendants(ns + nodnamn)
Alternativt trixxa ihop en egen extension eller så förstås
Sv: LINQ?
Funkar det?Sv:LINQ?
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");