Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XElement-如何将元素的子元素转换为字符串_C# - Fatal编程技术网

C# XElement-如何将元素的子元素转换为字符串

C# XElement-如何将元素的子元素转换为字符串,c#,C#,我使用.NET3.5框架中的XElement对象加载以下xml片段 XML示例: <xmlfragment> <list id="1" value="one" /> <list id="2" value="two" /> <other stuff="here" /> <more things="as well"></more> </xmlfragment> 对于.NET3.5,只需执行以下操作

我使用.NET3.5框架中的XElement对象加载以下xml片段

XML示例:

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

对于.NET3.5,只需执行以下操作

var result = string.Join(" ", xElement.Elements().Select(x => x.ToString()).ToArray());
因此,即使存在多级层次结构,也不会失败。

您可以使用子字符串剪切第一行和最后一行

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。

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

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

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

您不需要创建数组,ToString将被自动调用,因此String.Join、xmlfragment.DegenantNodes应该可以工作……很荣幸!!:当我尝试这样做时,它会说无法从System.Collections.Generic.IEnumerable转换为string[],您使用的是哪个版本的.NET?Join已经接受IEnumerable多年了。。。如果您使用的是非常旧的.NET版本,例如.NET 3.5,您应该在问题中这样说。啊,就是这样,我使用的是.NET 3.5:很抱歉。使用节点而不是后代节点?很抱歉,我没有指出我使用的是.NET 3.5框架。当原始工作代码不可用时,为什么要跳过节点?同样,您也可以使用string.Empty而不是空格…@JonSkeet:Coz OP说将所有内容放在字符串中,除了xmlfragment标记。。跳过的行包含从xmlfragement开始的整个xml。因此删除了它。@NikhilAgrawal:如果你使用了后代和自我,情况就是这样。。。现在您决定使用Environment.NewLine而不是space。OP说他们当前的代码对他们有效,所以我希望答案会给出相同的输出-你的答案不会。@JonSkeet:trusted and tested updated answer,在more element.XElement中添加另一个元素。
string results = string.Join(" ", xmlFragment.Nodes().Select(x => x.ToString()).ToArray());