用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?

谢谢!

用C#解析复杂的XML

由于未声明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查询。