用C#解析复杂的XML
本文关键字:XML 复杂 | 更新日期: 2023-09-27 17:58:32
我正在尝试用C#解析一个复杂的XML,我正在使用Linq来完成。基本上,我正在向服务器发出请求,然后我得到了XML,这是代码:
XElement xdoc = XElement.Parse(e.Result);
this.newsList.ItemsSource =
from item in xdoc.Descendants("item")
select new ArticlesItem
{
//Image = item.Element("image").Element("url").Value,
Title = item.Element("title").Value,
Description = this.Strip(item.Element("description").Value).Substring(0, 200).ToString()
}
这就是XML结构:
<item>
<test:link_id>1282570</test:link_id>
<test:user>SLAYERTANIC</test:user>
<title>aaa</title>
<description>aaa</description>
</item>
如何访问属性测试:例如link_id?
谢谢!
由于未声明test
命名空间,因此当前您的XML无效,您可以这样声明它:
<item xmlns:test="http://foo.bar">
<test:link_id>1282570</test:link_id>
<test:user>SLAYERTANIC</test:user>
<title>aaa</title>
<description>aaa</description>
</item>
有了这个,您可以使用XNamespace
用正确的名称空间限定您想要的XML元素:
XElement xdoc = XElement.Parse(e.Result);
XNamespace test = "http://foo.bar";
this.newsList.ItemsSource = from item in xdoc.Descendants("item")
select new ArticlesItem
{
LinkID = item.Element(test + "link_id").Value,
Title = item.Element("title").Value,
Description = this.Strip(item.Element("description").Value).Substring(0, 200).ToString()
}
在命名空间,必须使用XName对象具有正确名称空间的。对于C#,最常见的方法是使用初始化XNamespace包含URI的字符串,然后使用加法运算符重载到将命名空间与本地名称
要检索link_id元素的值,您需要为test:link元素声明并使用XML命名空间。
由于您没有在示例XML中显示名称空间声明,所以我假设它是在XML文档中的其他地方声明的。您需要在XML中定位命名空间声明(类似xmlns:test="http://schema.example.org"),通常在XML文档的根目录中声明
知道这一点后,可以执行以下操作来检索link_id元素的值:
XElement xdoc = XElement.Parse(e.Result);
XNamespace testNamespace = "http://schema.example.org";
this.newsList.ItemsSource = from item in xdoc.Descendants("item")
select new ArticlesItem
{
Title = item.Element("title").Value,
Link = item.Element(testNamespace + "link_id").Value,
Description = this.Strip(item.Element("description").Value).Substring(0, 200).ToString()
}
有关更多信息,请参阅C#中的XNamespace和Namespaces,以及如何在Namespaces中编写XML查询。