XElement - 如何将元素的后代转换为字符串

时间:2017-04-25 14:20:02

标签: c#

我在.Net 3.5 Framework中使用XElement对象加载以下xml片段。

示例XML:

<xmlfragment>
  <list id="1" value="one" />
  <list id="2" value="two" />
  <other stuff="here" />
  <more things="as well"></more>
</xmlfragment>

如何将xmlfragment的后代转换为字符串?换句话说,将所有内容放在除xmlfragment标记之外的字符串中。

以下作品,但想知道这是否是最简洁的方式。

string results = String.Join(" ", xmlfragment.DescendantNodes().Select(x=>x.ToString()).ToArray());

3 个答案:

答案 0 :(得分:2)

当您使用.NET 3.5时,没有特别简单的方法来简化它 - 尽管如果您发现自己经常需要它,您总是可以编写自己的静态方法来模拟string.Join的新重载。您可以在Select调用中使用方法组转换而不是lambda表达式,但如果您也使用旧的C#编译器,则可能也会导致问题。 (关于类型推断和方法组转换的确切规则随着时间的推移而发生了变化。)

但是,当存在嵌套元素时,当前代码将失败。看起来你只想要直接子节点:

string results = string.Join(" ", xmlFragment.Nodes().Select(x => x.ToString()).ToArray());

答案 1 :(得分:1)

对于.Net 3.5,只需执行

bin

因此,即使存在多个级别层次结构,也不会失败。

答案 2 :(得分:0)

您可以使用substring剪切第一行和最后一行。

string originalString = xdoc.ToString();
int startIndex = originalString.IndexOf(Environment.NewLine) + Environment.NewLine.Length;

var stringWithoutParent = originalString.Substring(startIndex,
    originalString.LastIndexOf(Environment.NewLine) - startIndex);

如果您希望元素以空格分隔(而不是行和缩进),则还要添加:

.Replace(" ", "")
.Replace(Environment.NewLine," ");

如果您没有操纵xml,并且它已经显示出已分隔的行,则根本不需要使用XElement