如何使用Linq-to-XML从带有名称空间的XML加载和访问数据
本文关键字:加载 XML 访问 数据 空间 Linq-to-XML 何使用 有名称 | 更新日期: 2023-09-27 18:19:27
在我之前的问题中,我不明白如何解决我的问题。Linq到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>
,我需要访问它。请写一些代码。
与@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
试试这个:(您的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);