Hej, skulle behöva lite tips för att knäcka en xml/xlinq-nöt: Jag löste en del av problemet väldigt enkelt visade det sig:Uppdatera attribut i Xelement
Jag skapar ett XDocument som innehåller något i stil med:
<root>
<place nv="1" ba="1" amt="0" sn="4321" time="2008-03-19T08:00:06" />
<place nv="2" ba="1" amt="0" sn="4321" time="2008-03-19T08:00:06" />
...
<place nv="6" ba="1" amt="0" sn="4321" time="2008-03-19T08:00:06" />
<place nv="1" ba="2" amt="0" sn="4321" time="2008-03-19T08:00:06" />
...
<place nv="6" ba="40" amt="0" sn="4321" time="2008-03-19T08:00:06" />
</root>
Altså en mängd 'place' noder.
Vidare fångar jag fragment av xml från en server, dessa fragment liknar ovanstående men innehåller ofta bara några av attributen i Xdocumentet, dessa fragment kan innehålla en eller fler 'place'-noder t.ex.
<place nv="2" ba="1" amt="4" time="2008-03-31T08:00:06" />
<place nv="3" ba="22" sn="1111" time="2008-03-31T08:00:06" />
Jag vill updatera XDocumentet med den infångade data d.v.s.
noden med attribut nv="2" och ba="1" ska updateras med amt-attributet från "0" till "4", och nod 3-22 ska updateras med sn="1111" samt time-attributen på båda.
Jag försöker sedan m.h.a LinqToXml att välja ut rätt noder och uppdatera:
XElement xlelm = XElement.Load(new StringReader(indata)); //läser in fragment
var elm = from em in xlelm.Descendants("place")
select em;
foreach (var xl in elm) //för varje nod i fångat fragment, matcha nv och ba
{ //_xelmdoc nedan är det XDocument jag vill uppdatera
var repnode = from cn in _xelmdoc.Descendants("place")
where (cn.Attribute("nv").Value) == (xl.Attribute("nv").Value) &&
(cn.Attribute("nv").Value) == (xl.Attribute("ba").Value)
select cn;
foreach (var r in xl.Attributes()) //för varje attribut i fångade xmlfragmentet
{
//Här vill jag altså uppdatera rätt nod i XDocument:et men vet inte hur/om
//jag ska använda min repnode-variabel som faktiskt innehåller rätt data.
}
}
Behöver tips på hur jag får rätt nod att uppdateras i XDocumentet. Hur utnyttjar jag repnode-variabeln för att updatera?
Tack på förhand, Tobbe.
Sv: Uppdatera attribut i Xelement
repnode.ElementAt(0).SetAttributeValue(r.Name, r.Value);
...i foreach-satsen gjorde susen, vet inte om det är det effektivaste sättet att göra. Worst case scenario är att xml-fragmenten regnar in med ca 200 st/sek, vet inte om jag kommer få prestandaproblem då. Om någon har förslag på smartare sätt att göra så är jag tacksam.
I övrigt anser jag frågan löst och markerar den som så inom kort...