使用Linq从XML源文件构造wpf超链接元素的列表

时间:2014-11-06 13:15:48

标签: c# xml wpf linq

我有一个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>

从中,我想构建一堆包含

的超链接元素
  • 显示文字
  • URI
  • 导航到URI的方法

显然,有很多方法可以解决这个问题,而且从历史上看,我可能会做这样的事情:

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();

哪个不起作用。如果有人能告诉我如何解决这个问题,我将不胜感激。

2 个答案:

答案 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();