使用Linq to XML在C#中解析XML字符串并获取其属性值

3

我是Linq to XML的新手,尝试使用C#中的Linq to XML解析XML字符串并检索其属性值。

我的XML字符串如下:

<configuration xmlns:lui="http://www.xyz.com/UITags">
   <pub id="pubId1" lang="en-US">
     <configitem name="visible" value="visible"/>
     <configitem name="working_status" value="unlocked"/>
     <configitem name="prepared" value="prepared"/>
   </pub>
.....
.....
   <pub id="Pub2" lang="es-XM">...</pub>
....
....
</configuration>

我希望从pub节点中获取'id'和'lang'的值,以及从configitem节点中获取名为'working_status'的属性值。

现在,由于我将上述XML作为字符串参数(即myXmlData)传递,因此通过执行以下操作

XmlDocument doc = new XmlDocument();
            doc.LoadXml(myXmlData);
XmlNodeList publicationsNodeList = doc.SelectNodes("//configuration/pub");

接下来我需要使用foreach循环,但我尽量想避免这种方式。 有人能帮我用C#中的Linq to XML实现这个过程吗?

2个回答

5
以下LINQ to XML查询将返回由匿名对象组成的序列,这些对象包含pub元素的id、lang和工作状态:
var xdoc = XDocument.Parse(myXmlData);
var query = 
  from p in xdoc.Root.Elements("pub")
  let ws = p.Elements("configitem")
            .FirstOrDefault(c => (string)c.Attribute("name") == "working_status")
  select new {
      Id = (string)p.Attribute("id"),
      Lang = (string)p.Attribute("lang"),
      WorkingStatus = (ws == null) ? null : (string)ws.Attribute("value")
  };

对于您的示例xml,它返回以下数据的两个对象:

{
   Id = "pubId1",
   Lang = "en-US",
   WorkingStatus = "unlocked"
},
{
   Id = "Pub2",
   Lang = "es-XM",
   WorkingStatus = null
}

错误 130:'System.Xml.Linq.XElement' 不包含 'FirstOrDefault' 的定义,并且找不到接受类型为 'System.Xml.Linq.XElement' 的第一个参数的扩展方法 'FirstOrDefault'(您是否缺少使用指令或程序集引用?) - Biki
正如我所提到的,我已经添加了System.Linq,但仍然看到这个错误。并且我无法在框架部分找到System.Linq以进行引用添加。 - Biki
2
@Biki 看看你的错误信息:有没有可能是你打错了 p.Element("configitem")(没有 s)? - decPL
谢谢@lazyberezovsky。我在想是否需要将Id和Lang值存储在另一个对象(比如Publication)中,而不是创建一个匿名对象。我能否在同一语句中完成这个操作,还是需要单独循环你的结果并填充它? - Biki
@Biki 在创建对象时只需添加类名:select new Publication { Id = ... } - Sergey Berezovskiy
显示剩余3条评论

1
var query = from x in xdoc.Descendants("pub")
                select new
                {
                    Id = (string)x.Attribute("id"),
                    Lang = (string)x.Attribute("lang"),                        
                    Name = x.Descendants("configitem").Select(y => y.Attribute("name").Value).FirstOrDefault(y => y == "working_status")
                };

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接