Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# linq查询如何在xml上工作_C#_Xml_Linq - Fatal编程技术网

C# linq查询如何在xml上工作

C# linq查询如何在xml上工作,c#,xml,linq,C#,Xml,Linq,嗨,我有如下xml <BrowserMix> <BrowserProfile Percentage="10"> <Browser Name="Internet Explorer 10.0" MaxConnections="6"> <Headers> <Header Name="User-Agent" Value="Mozi

嗨,我有如下xml

 <BrowserMix>
            <BrowserProfile Percentage="10">
              <Browser Name="Internet Explorer 10.0" MaxConnections="6">
                <Headers>
                  <Header Name="User-Agent" Value="Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)" />
                  <Header Name="Accept" Value="*/*" />
                  <Header Name="Accept-Language" Value="{{$IEAcceptLanguage}}" />
                  <Header Name="Accept-Encoding" Value="GZIP" />
                </Headers>
              </Browser>
            </BrowserProfile>
            <BrowserProfile Percentage="85">
              <Browser Name="Internet Explorer 9.0" MaxConnections="6">
                <Headers>
                  <Header Name="User-Agent" Value="Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)" />
                  <Header Name="Accept" Value="*/*" />
                  <Header Name="Accept-Language" Value="{{$IEAcceptLanguage}}" />
                  <Header Name="Accept-Encoding" Value="GZIP" />
                </Headers>
              </Browser>
            </BrowserProfile>
            <BrowserProfile Percentage="5">
              <Browser Name="WinPhone8" MaxConnections="6">
                <Headers>
                  <Header Name="User-Agent" Value="Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 920)" />
                  <Header Name="Accept" Value="*/*" />
                  <Header Name="Accept-Language" Value="{{$IEAcceptLanguage}}" />
                  <Header Name="Accept-Encoding" Value="GZIP" />
                </Headers>
              </Browser>
            </BrowserProfile>
          </BrowserMix>
我总是得不到任何结果

// untested 
var browserQuery = xdoc.Root.Descendants("BrowserProfile")
                       .Select(dt => new {
                          BrowserMix = dt.Attribute("Percentage").Value,
                          Name = dt.Element("Browser").Attribute("Name").Value
                       });
需要注意的几点:

  • .Root

  • 子体
    元素
    返回
    IEnumerable
    ,因此不需要包含
    .AsEnumerable()

  • 默认情况下,
    XElement.Value
    属性返回字符串,因此不需要
    .ToString()


您发布的代码存在一些问题:

  • 您不需要在
    XDocument.subjections(XName)
    上使用
    AsEnumerable()
    ,因为这已经返回了一个
    IEnumerable
    集合

  • 您需要指定具有要查找的属性的元素;由于您从名为Root的所有元素的集合开始,它将在Root中查找这些属性

  • .Value
    返回一个字符串,因此无需对其调用
    .ToString()

  • 没有得到任何结果的原因是因为#2(根上没有百分比或名称属性)

    试试这个:

    // xml is a string containing the xml posted in the question
    XDocument xdoc = XDocument.Parse(xml);
    
    var browserQuery = from dt in xdoc.Descendants("BrowserProfile")
                       select new
                       {
                           Percentage = dt.Attribute("Percentage").Value,
                           Name = dt.Element("Browser").Attribute("Name").Value
                       };
    
    此代码的作用是:

  • 获取所有BrowserProfile元素(及其子元素)的集合
  • 它返回具有Percentage属性值和Name元素值的匿名类型集合。请注意,Browser元素用于访问Name属性
  • 然后,您可以在此集合中循环:

    for each (var browser in browserQuery)
    {
    
        Console.WriteLine("Browser {0} has {1} percent", browser.Name, browser.Percentage);
    }
    
    编辑

    要处理名称空间,请如下使用
    XNamespace

    XNamespace ns = "microsoft.com/schemas/VisualStudio/TeamTest/2010";
    
    然后将其添加到元素名称之前:

    var browserQuery = from dt in xdoc.Descendants(ns + "BrowserProfile")
                       select new
                       {
                           Percentage = dt.Attribute("Percentage").Value,
                           Name = dt.Element(ns + "Browser").Attribute("Name").Value
                       };
    

    您是否已将该美女加载到
    XDocument
    中?是的,我已将其加载到上述xml中。请编辑您的帖子以包含Linq to xml代码。更新Linq代码。为什么你被否决了呢?删除了否决票,如果你的编辑使它更适合这样做的话,就需要一个mod来重新评估。安德鲁·巴伯的便条总结了投票失败的原因。不要认为这是针对个人的,这只是在头版上获得更好的问题。给出“枚举未产生结果”可能以不需要
    Root
    的方式加载文档。试着让我知道。看来@Tim没有使用
    根目录
    ,这可能是问题所在…??另外,我看到了上面关于名称空间等的附加注释。运气不好。给出的结果为“枚举未产生结果”。您如何创建XDocument?我用你发布的XML测试了上面的代码,它按预期工作-我得到了3个对象的集合。我在我的代码中添加了一行,显示了我如何为我的测试创建XDocument。确切的XML就像浏览器配置文件中有xmlns…是不是产生了问题我已经更新了我的答案,以显示如何处理名称空间问题。
    var browserQuery = from dt in xdoc.Descendants(ns + "BrowserProfile")
                       select new
                       {
                           Percentage = dt.Attribute("Percentage").Value,
                           Name = dt.Element(ns + "Browser").Attribute("Name").Value
                       };