【问题标题】:Parsing a xml string & retrieving its attribute Value using Linq to XML C#使用 Linq to XML C# 解析 xml 字符串并检索其属性值
【发布时间】:2013-12-04 07:59:01
【问题描述】:

我对 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 来实现这一点,而不是传统的方式。

【问题讨论】:

    标签: c# xml linq c#-4.0 linq-to-xml


    【解决方案1】:

    以下 LINQ to XML 查询将返回匿名对象序列,其 id、lang 和工作状态为 pub 元素:

    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
    }
    

    【讨论】:

    • 感谢您的快速回复。我是否需要为以下错误添加任何命名空间?注意:我已经添加了 System.Linq。
    • 错误 130“System.Xml.Linq.XElement”不包含“FirstOrDefault”的定义,并且没有扩展方法“FirstOrDefault”接受“System.Xml.Linq.XElement”类型的第一个参数可以找到(您是否缺少 using 指令或程序集引用?)
    • @Biki 是的,你需要为这个扩展方法添加System.Linq 命名空间
    • 正如我所提到的,我已经添加了 System.Linq,但仍然看到此错误。此外,我无法从框架部分找到 System.Linq 以添加到我的参考中。
    • @Biki 正在查看您的错误消息:您是否输入过 p.Element("configitem")(没有 s)?
    【解决方案2】:
    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")
                    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-20
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多