【问题标题】:Linq to XElement, multiple parametersLinq to XElement,多个参数
【发布时间】:2017-04-20 09:30:50
【问题描述】:

我正在创建一个XElement 对象,但在使用 Linq 向一个节点添加多个元素时遇到问题。

有一个具有多个属性的对象列表:

class Point { int x; int y; ... }

List<Point> Points = new List<Point>()
{ 
  new Point(1,2), 
  new Point(3,4) 
};

我想使用单个构造函数(一次性)将此列表转换为平面 XElement

我想看的:

<Points>
  <x>1</x>
  <y>2</y>
  <x>3</x>
  <y>4</y>
</Points>

到目前为止我走的最远:

new XElement("Points",
  Points.Select(a => new {
    X = new XElement("x", a.x),
    Y = new XElement("y", a.y)
  });

生成一个嵌套列表,解析为单个 XElement

<Points>{ X = <x>1</x>, Y = <y>2</y> }{ X = <x>3</x>, Y = <y>4</y> }</Points>

(我需要保留顺序,这样联合就不起作用了)

我想在构造函数中做所有事情,就像上面一样,不想像这样手动添加点:

XElement PointsXml = new XElement("Points");
foreach (var item in Points)
{
  PointsXml.Add(item.x);
  PointsXml.Add(item.y);
}

【问题讨论】:

    标签: c# linq linq-to-xml xelement


    【解决方案1】:

    以下方法可行:

    var xml= new XElement("Points", 
        Points.SelectMany(a => new [] { new XElement("x", a.x), new XElement("y", a.y)}));
    

    或者,如果您想将每个点包装在自己的元素中,那么:

    var xml= new XElement("Points", 
        Points.Select(a => 
            new XElement("Point", new XElement("x", a.x), new XElement("y", a.y))));
    

    诀窍是始终添加XElement 的对象。 您使用的代码将重新运行 anonymous object 而不是这个需要的 XElement 数组

    【讨论】:

    • 工作就像一个魅力,非常感谢!此外,Points.Select(a =&gt; new [] ... 也有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多