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! 🙂