C# Linq到XML不提供任何值

C# Linq到XML不提供任何值,c#,xml,linq,C#,Xml,Linq,我只是不知道这个代码有什么问题。。。知道我做错了什么吗。select返回一个包含所有null属性的项,即foreach循环输入一次,WMServer服务器。[pick attribute]设置为null var xdoc = XDocument.Load(@"pathtoxmlfile.xml"); var wms = from e2 in xdoc.Elements("GISImportConfig").Elements("BaseMapLayers") select ne

我只是不知道这个代码有什么问题。。。知道我做错了什么吗。select返回一个包含所有null属性的项,即foreach循环输入一次,WMServer服务器。[pick attribute]设置为null

var xdoc = XDocument.Load(@"pathtoxmlfile.xml");
var wms = from e2 in xdoc.Elements("GISImportConfig").Elements("BaseMapLayers")
          select new
          {
              Url = (string)e2.Attribute("url"),
              Enabled = (string)e2.Attribute("enabled"),
              UserName = (string)e2.Attribute("username"),
              Pasword = (string)e2.Attribute("password"),
              Layers = e2.Elements("WMLayer")
          };

foreach (var Config in wms)
{
    WMServer server = new WMServer();
    server.ServerURL = Config.Url;
    server.Enabled = Convert.ToBoolean(Config.Enabled);
    server.UserName = Config.UserName;
    server.Password = Config.Pasword;

    foreach (var layers in Config.Layers)
    {
        WMLayer layer = new WMLayer();
        layer.Group = (string)layers.Attribute("group");
        layer.Enabled = Convert.ToBoolean(layers.Attribute("enabled"));
        layer.Name = (string)layers.Attribute("name");
    }
}
xml:


您只得到一个结果,因为您只有一个
元素,这就是您在查询中要查找的元素。添加
.Elements(“WMServer”)
方法调用,它应该可以工作:

from e2 in xdoc.Elements("GISImportConfig").Elements("BaseMapLayers").Elements("WMServer")
select new
{
    Url = (string)e2.Attribute("url"),
    Enabled = (string)e2.Attribute("enabled"),
    UserName = (string)e2.Attribute("username"),
    Pasword = (string)e2.Attribute("password"),
    Layers = e2.Elements("WMLayer")
};

返回2个具有非空属性值的元素。

看起来您正在尝试获取
WMServer
元素,并且当前正在选择
BaseMapLayers
元素(其中只有一个存在)

通过执行以下操作,可以获取
WMServer
元素:

from e2 in xdoc.Descendants("WMServer")
select new
{
      Url = (string)e2.Attribute("url"),
      Enabled = (string)e2.Attribute("enabled"),
      UserName = (string)e2.Attribute("username"),
      Pasword = (string)e2.Attribute("password"),
      Layers = e2.Elements("WMLayer")
};
这将获取所有
WMServer
子元素


我认为MarcinJuraszek有一个更好的答案(添加相关元素),因为如果您发现一个放错位置的
WMServer
元素,或者只希望这些元素位于xml中的特定位置,那么遇到问题的范围就更小。

Select
无法更改原始源代码的元素计数,这意味着您必须查看源代码…我认为您在
xml
中有一个额外的
(与问题无关)。谢谢,源xml文件中没有。我已经编辑了这个问题。@will我可以看到您的xml文件只有1个
BaseMapLayers
元素,那么您怎么能期望它有1个以上的元素呢?我想了解有关WMS服务器元素(其中两个)的信息,感谢您解释您的答案与MarcinJuraszek的不同之处。这有帮助。
from e2 in xdoc.Descendants("WMServer")
select new
{
      Url = (string)e2.Attribute("url"),
      Enabled = (string)e2.Attribute("enabled"),
      UserName = (string)e2.Attribute("username"),
      Pasword = (string)e2.Attribute("password"),
      Layers = e2.Elements("WMLayer")
};