【问题标题】:C# Linq XML Extract Value By ElementNameC# Linq XML 按 ElementName 提取值
【发布时间】:2012-07-20 19:15:39
【问题描述】:

我有以下示例 MODS XML 部分:

<modsCollection xsi:schemaLocation="http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-4.xsd" xmlns="http://www.loc.gov/mods/v3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <mods version="3.4">
      <titleInfo>
         <title>PhD study</title> 
         <subTitle>trends and profiles 1996-97 to 2009-10</subTitle> 
      </titleInfo>
   <typeOfResource>text</typeOfResource> 
     ...
   </mods>
</modsCollection>

我的尝试:

        XNamespace ns = "http://www.loc.gov/standards/mods/v3";
        var test = modsDoc.Descendants(ns + "title").Single().Value;
        test.Should().NotBeNull();

Source Example.

以上内容绝对没有给我任何东西! 'System.InvalidOperationException:序列不包含任何元素'

【问题讨论】:

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


    【解决方案1】:

    因为您在代码中使用的 NameSpace 是错误的。应该是:

    XNamespace ns = "http://www.loc.gov/mods/v3";
    

    或者如果您想避免命名空间,请尝试:

    var test2 = modsDoc.Descendants().Where(a => a.Name.LocalName == "title").Single().Value;
    

    编辑:

    检查这个例子:

    XDocument modsDoc = XDocument.Load("test.xml");
    XNamespace ns = "http://www.loc.gov/mods/v3";
    var test = modsDoc.Descendants(ns + "title").Single().Value;
    var test2 = modsDoc.Descendants().Where(a => a.Name.LocalName == "title").Single().Value;
    Console.WriteLine(test);
    Console.WriteLine(test2);
    

    输出将是:

    PhD study
    PhD study
    

    【讨论】:

    • 已经尝试过第一个建议让我试试第二个。 - :(
    • @IbrarMumtaz,这两种方法我都试过了,效果很好
    • 在将 '.Single()' 更改为 '.FirstOrDefault' 后,后一种方法似乎有效。
    • @IbrarMumtaz,这意味着您的 xml 中有多个标题,如果有多个记录或没有记录,Single 将失败
    猜你喜欢
    • 2021-11-07
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 2018-05-21
    • 2016-05-18
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多