1 2 3 4 5 6 7 |
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); |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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 vidite, zde muzete specifikovat LocalName i Namespace pro rozliseni. A nakonec jeden priklad jak parsovat xml se vnorenou strukturou:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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 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! 🙂