如何使用带有命名空间的XML从Linq to XML加载和访问数据

时间:2012-01-05 13:59:41

标签: c# linq-to-xml

在我之前的问题中,我不明白如何解决我的问题。 Linq to XML, how to acess an element in 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 :(得分: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

答案 1 :(得分: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);