当前位置:  开发笔记 > 编程语言 > 正文

使用LINQ将XML标记的集合连接到字符串

如何解决《使用LINQ将XML标记的集合连接到字符串》经验,为你挑选了1个好方法。

我无法使用我无法控制的Web服务,并且正在尝试将该服务返回的XML解析为标准对象.

XML结构的一部分看起来像这样


   Some text here 
   Some additional text here 
   Still more text here 

最后,我想最终得到一个String属性,看起来像"有些文本在这里一些额外的文字这里还有更多的文字在这里"

我对初始通行证的内容如下.我想我已经走上了正轨,但还没到那里:

XElement source = \\Output from the Webservice
List result;

result = (from indexentry in source.Elements(entryLevel)
    select new IndexEntry()
    {
        EtiologyCode = indexentry.Element("IE") == null ? null : indexentry.Element("IE").Value,
        //some code to set other properties in this object
        Note = (from l in indexentry.Elements("NO").Descendants
                select l.value)  //This is where I stop
                               // and don't know where to go
    }

我知道我可以在该查询的末尾添加一个ToList()运算符来返回该集合.是否有一个opertaor或技术允许我将该集合的连接内联到一个字符串?

如果不清楚,请随时询问更多信息.

谢谢.



1> Jon Skeet..:

LINQ to XML确实就是这样的方式:

var textArray = topElement.Elements("L")
                          .Select(x => x.Value)
                          .ToArray();

var text = string.Join(" ", textArray);

编辑:基于评论,看起来你只需要一种表达方式的单一表达方式.这很容易,如果有点难看:

result = (from indexentry in source.Elements(entryLevel)
    select new IndexEntry
    {
        EtiologyCode = indexentry.Element("IE") == null 
                           ? null 
                           : indexentry.Element("IE").Value,
        //some code to set other properties in this object
        Note = string.Join(" ", indexentry.Elements("NO")
                                          .Descendants()
                                          .Select(x => x.Value)
                                          .ToArray())
    };

另一种方法是将其提取为单独的扩展方法(它必须位于顶级静态类中):

public static string ConcatenateTextNodes(
    this IEnumerable elements)
{
    string[] values = elements.Select(x => x.Value).ToArray();
    // You could parameterise the delimiter here if you wanted
    return string.Join(" ", values);
}

然后将您的代码更改为:

result = (from indexentry in source.Elements(entryLevel)
    select new IndexEntry
    {
        EtiologyCode = indexentry.Element("IE") == null 
                           ? null 
                           : indexentry.Element("IE").Value,
        //some code to set other properties in this object
        Note = indexentry.Elements("NO")
                         .Descendants()
                         .ConcatenateTextNodes()
    }

编辑:关于效率的说明

其他答案建议以StringBuilder效率的名义使用.在使用它之前,我会检查这是正确的方法.如果你考虑它StringBuilderToArray做类似的事情 - 他们创建一个比他们需要更大的缓冲区,向它添加数据,在必要时调整它的大小,并在最后得出结果.希望你不需要经常调整大小.

这里和之间的区别在于缓冲 - 它是你到目前为止构建的字符串的全部内容.有它只是参考.换句话说,调整用于内部缓冲区的大小可能比调整大小更便宜,特别是如果单个字符串很长.StringBuilderToArrayStringBuilderToArrayToArrayStringBuilder

在进行缓冲之后ToArray,string.Join非常有效:它可以查看所有字符串开始,准确计算分配多少空间,然后连接它而无需复制实际的字符数据.

这与我之前给出的答案形成鲜明对比 - 但不幸的是,我认为我没有写过基准.

我当然不会期望ToArray明显更慢,我认为它使代码更简单 - 不需要使用副作用等,聚合等.

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有