2012-01-05 2 views
-1

В моем предыдущем вопросе здесь я не понял, как решить мою проблему. Linq to XML, how to acess an element in C#? Вот мой XML мне нужно разобрать:Как загрузить и получить доступ к данным с Linq в XML из 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> и мне нужно получить к нему доступ. Пожалуйста, введите код.

+3

Если это незаконный xml, вы не можете разобрать его с Linq на Xml - вам нужно исправить свой XML, также см. Ответы на ваш предыдущий вопрос – BrokenGlass

+0

и XML, это неверно, и поэтому вы не можете разобрать. Если с вами все в порядке, я бы предложил открыть этот xml-файл в VS и заменить 'photo: mtime>' на 'photoMtime>' –

ответ

0

Вопреки комментариям @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 
+0

Почему я получаю несколько раз отличный результат xml после применения вашего метода? 1 '<{photo} mtime> 12' 2 ' 12' –

0

Попробуйте это: (Ваш 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); 
Смежные вопросы