Jak cist xml v LINQu aneb co delat kdyz xml tridy .net nedelaji co od nich cekate a vraceji null

Cca 4h jsem stravil menenim vseho mozneho, protoze mi XML tridy, ktere jsou v .NET 2.0 prestali cist data – proste na vsechno vratili null. To neni u me poprve co .net xml tridy “blbnou” a stavkuji. Proto jsem se rozhodl vyzkouset LINQ. Nejdrive ve VC# 2010 ale brzo jsem zjistil ze kdyz si pridam do projektu C# 2.0 assembly System.Xml.Linq.dll ve verzi 3.5.0.0, mohu s tim pracovat s nejakymi omezenimi v ramci syntaxe i zde. Trochu jsem s tim laboroval a prisel jsem na toto:

-Pokud mate xml kde nemate specifikovany vsechny namespace, musite tento xml pred spustenim upravit nebo tam ty namespace pridat. Treba wordpress generuje export file bez atom namespace, takto jej tam pridate natrvalo do toho souboru:

Nemusite se bat ze by se vam tyto namespace zduplikovali, trida XmlDocument si to hlida.
A ted k samotnemu LINQu. Metodou XDocument.Element se mi podarilo ziskat element bez prefixu ale kdyz jsem mu zadal prefix jakykoliv(treba {wp}) tak mi taky vzdy vracel null. Toto se mi ale nestalo kdyz jsem prochazel zjistene elementy ve smycce:

Jak vidite, zde muzete specifikovat LocalName i Namespace pro rozliseni. A nakonec jeden priklad jak parsovat xml se vnorenou strukturou:

Jinak mi to nefungovalo a vlastne to neni zadna skoda. Pracuje se s tim trochu jinak ale je hlavni ze to funguje. Ted uz jen at to funguje vzdy a ne jen nekdy! 🙂

Leave a Reply