C# linq查询如何在xml上工作
嗨,我有如下xmlC# 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
<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
集合.Value
返回一个字符串,因此无需对其调用.ToString()
// 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
};
此代码的作用是:
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
};