Как загрузить и получить доступ к данным с Linq в XML из XML с пространствами имен - PullRequest
0 голосов
/ 05 января 2012

В моем предыдущем вопросе я не понимал, как решить мою проблему. Linq to XML, как получить доступ к элементу в C #? Вот мой XML, который мне нужно проанализировать:

<root>
         <photo>/filesphoto.jpg</photo>
         <photo:mtime>12</photo:mtime>
         <text>some text</text>
 </root>

Для доступа к элементу я использую этот код:

var doc = XDocument.Parse(xml.Text);
doc.Descendants("text").FirstOrDefault().Value;

Как я могу получить доступ? У меня есть попытка http://aspnetgotyou.blogspot.com/2010/06/xdocument-or-xelement-with-xmlnamespace.html, Но он игнорируется <photo:mtime>, и мне нужно получить к нему доступ. Пожалуйста, напишите какой-нибудь код.

Ответы [ 2 ]

0 голосов
/ 05 января 2012

Попробуйте: (Ваш xml немного изменился, см.)

 string xml = "<root><photo>/filesphoto.jpg</photo><photoMtime>12</photoMtime><text>some text</text></root>";
 var doc = XDocument.Parse(xml);
 string value = doc.Descendants("text").FirstOrDefault().Value;
 MessageBox.Show(value);
0 голосов
/ 05 января 2012

Вопреки комментариям @BrokenGlass, ваш XML не является недействительным. На самом деле методика по ссылке, которую вы указали в своем вопросе (для загрузки пространств имен), работает нормально. Может быть, вы просто не изменили пример для своих нужд. Вот более компактное обобщение для разбора xml-фрагментов с пространствами имен в XElement:

public static XElement parseWithNamespaces(String xml, String[] namespaces) {
    XmlNamespaceManager nameSpaceManager = new XmlNamespaceManager(new NameTable());
    foreach (String ns in namespaces) { nameSpaceManager.AddNamespace(ns, ns); }
    return XElement.Load(new XmlTextReader(xml, XmlNodeType.Element, 
        new XmlParserContext(null, nameSpaceManager, null, XmlSpace.None)));
}

Используя ваш точный ввод:

string xml = 
@"<root>
    <photo>/filesphoto.jpg</photo>
    <photo:mtime>12</photo:mtime>
    <text>some text</text>
</root>";
XElement x = parseWithNamespaces(xml, new string[] { "photo" });
foreach (XElement e in x.Elements()) { 
    Console.WriteLine("{0} = {1}", e.Name, e.Value); 
}
Console.WriteLine(x.Element("{photo}mtime").Value);

Печать:

photo = /filesphoto.jpg
{photo}mtime = 12
text = some text
12
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...