从列表创建节点<;XElement>;使用linq

本文关键字:XElement 使用 linq gt lt 列表 创建 节点 | 更新日期: 2023-09-27 18:26:58

我想创建以下xml

<BookStore>
  <Book>
    <Name></Name>
    <Author></Author>
    <Price></Price>
  </Book>
  <Book>
    <Name></Name>
    <Author></Author>
    <Price></Price>
  </Book>
</BookStore>

来自

List<XElement> Book= xdoc.XPathSelectElements("s0:Name| s0:Author| s0:Price", namespaceManager).ToList();

我在以下地方感到震惊:

XNamespace s0 = "urn:service.Bookstore.com";
XElement root=new XElement(s0 + "BookStore",
                 new XElement("Book",Book,
                              );
XDocument result = new XDocument(root);

但这使得xml结构成为

<BookStore>
  <Book>
    <Name></Name>
    <Author></Author>
    <Price></Price>
    <Name></Name>
    <Author></Author>
    <Price></Price>
  </Book>
</BookStore>

请帮我取得预期的产出。由于基本xml结构看起来像这个

<BookStore>
  <Book>
    <Name></Name>
    <Author></Author>
    <Price></Price>
    <Name></Name>
    <Author></Author>
    <Price></Price>
  </Book>
</BookStore>

但我希望它是的两个独立实例

从列表创建节点<;XElement>;使用linq

听起来基本上需要获取元素列表,并将它们分组为3个元素的一组,将每组放入一个Book元素中:

// The name/author/price elements you're already getting
var elements = ...; 
var groups = elements.Select((value, index) => new { value, index })
                     .GroupBy(pair => pair.index / 3, pair => pair.value);
XNamespace s0 = "urn:service.Bookstore.com";
XDocument result = new XDocument(new XElement(s0 + "BookStore",
    groups.Select(g => new XElement("Book", g))));

试试看:

XElement xElement = new XElement("BookStore", new XElement("Book", new XElement("Name", "value"), new XElement("Author", "value"), new XElement("Price", "value")));
xElement.Save("Location.xml");