我有一个xml文件,如下所示:
<Links>
<Link>
<Text>Google</Text>
<Uri>http://www.google.com</Uri>
</Link>
<Link>
<Text>Yahoo</Text>
<Uri>http://www.yahoo.co.uk</Uri>
</Link>
</Links>
从中,我想构建一堆包含
的超链接元素显然,有很多方法可以解决这个问题,而且从历史上看,我可能会做这样的事情:
List<ACMEXmlNode> nodes = ACMEXmlParser.GetNodes("Link", targetDoc);
List<Hyperlink>;
foreach (var node in nodes) {
var currentLink = new Hyperlink();
currentLink.Uri = node.ChildNode("Uri").Value;
// Can't work out how to do the below line in a linq statement
currentLink.ContentStart.InsertTextInRun(node.ChildNode("Text").Value);
currentLink.RequestNavigate += this.DoBrowserNavigate;
}
然而,我也在尝试学习Linq,这似乎应该是它的典型用例。任何人都可以帮助我如何用它完成同样的事情?到目前为止,我有:
_Links = new List<Hyperlink>(
from linkElement in oLinksConfig.Descendants("Links")
select new Hyperlink
{
NavigateUri = new System.Uri(linkElement.Element("Uri").Value ),
// Fails...
ContentStart.InsertTextInRun(linkElement.Element("Text").Value)
}
).ToList();
哪个不起作用。如果有人能告诉我如何解决这个问题,我将不胜感激。
答案 0 :(得分:2)
您的问题不在于LINQ本身,而在于您选择的LINQ语法以及您有声明的事实:
ContentStart.InsertTextInRun(linkElement.Element("Text").Value)
在object initializer区块内。
相反,请使用以下内容:
var links = oLinksConfig
.Descendants("Links")
.Select(
linkElement =>
{
var link = new HyperLink { /* your initializations of properties with setters */ };
//statements are after you have an instance of the class
link.ContentStart.InsertTextInRun(linkElement.Element("Text").Value;
return link;
})
.ToList();
答案 1 :(得分:1)
您可以尝试以下操作:
_Links = nodes.Select(node => {
var currentLink = new Hyperlink();
currentLink.NavigateUri = new Uri(node.Element("Uri").Value);
currentLink.ContentStart
.InsertTextInRun(node.Element("Text").Value);
currentLink.RequestNavigate += this.DoBrowserNavigate;
return currentLink;
}).ToList();
如果您希望输入只是普通的xml文件,请尝试改为:
_Links = oLinksConfig.Descendants("Link")
.Select(link => {
var currentLink = new Hyperlink();
currentLink.NavigateUri = new Uri(link.Element("Uri").Value);
currentLink.ContentStart
.InsertTextInRun(link.Element("Text").Value);
currentLink.RequestNavigate += this.DoBrowserNavigate;
return currentLink;
}).ToList();