Jak číst xml v LINQu aneb co dělat když xml třídy .net nedělají co od nich čekáte a vrací null

C#
NameTable nt = new NameTable();
XmlNamespaceManager xn2 = new XmlNamespaceManager(nt);
xn2.AddNamespace("atom", "http://www.w3.org/2005/Atom");
string c = @"F:\Mona\Visual Studio 2008\Projects\LinqLearn\LinqLearn\sunamoblog.wordpress.2012-03-12.xml";
XmlDocument xd2 = new XmlDocument(nt);
xd2.Load(c);
xd2.Save(c);

Nemusíte se bát že by se vám tyto namespace zduplikovaly, třída XmlDocument si to hlídá.
A teď k samotnému LINQu. Metodou XDocument.Element se mi podařilo získat element bez prefixu ale když jsem mu zadal prefix jakýkoliv(třeba {wp}) tak mi taky vždy vracel null. Toto se mi ale nestalo když jsem procházel zjištěné elementy ve smyčce:

C#
i = 0;
foreach (XElement item in nods2)
{
    Debug.Print(i.ToString() + " " + item.Name.LocalName);
    i++;
    if (item.Name.LocalName == "title")
    {
        title = item.Value;
    }
    else if (item.Name.LocalName == "extendedProperty" && item.Name.NamespaceName == "gd")
    {
        extendedProperty = item.Attribute("value").Value;
    }
}

Jak vidíte, zde můžete specifikovat LocalName i Namespace pro rozlišení. A nakonec jeden příklad jak parsovat xml se vnořenou strukturou:

C#
private static void EnumeratingDescedantsFromElement()
{
    int i = 0;
    XDocument xd = XDocument.Load(@"F:\Mona\Visual Studio 2008\Projects\LinqLearn\LinqLearn\XMLFile1.xml");
    //-Pouzivejte metodu Elements zasadne bez jmena
    IEnumerableXElement > entries = xd.Root.Elements();
    foreach (XElement item in entries)
    {
        //-Teprve ve smycce muzeme zjistovat jmena uzlu a podle toho s nimi pracovat
        //-Musime se ptat na LocalName, jinak program vyhodnoti podminku jako false
        if (item.Name.LocalName == "entry")
        {
            IEnumerableXElement > nods = item.Elements();
            foreach (XElement item2 in nods)
            {
                Debug.Print(i.ToString() + " " + item2.Name.LocalName);
                i++;
            }
        }
    }
}

Jinak mi to nefungovalo a vlastně to není žádná škoda. Pracuje se s tím trochu jinak ale je hlavní že to funguje. Teď už jen ať to funguje vždy a ne jen někdy! 🙂

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *