使用Linq在xml中添加项目索引

时间:2018-08-05 02:13:15

标签: c# xml linq

我有此代码:

private XElement buildTemplateOrderXML(List<TemplateOrderLines> templateOrderLines, String sessionId, XNamespace ns1)
    {
        //build the xml objects and return them
        return new XElement(ns1 + "TemplateParameters",
            templateOrderLines.Select(item =>
                new XElement(ns1 + "TemplateOrderLines",
                    new XElement(ns1 + "TemplatePartDesc", item.TemplatePartDesc),
                    new XElement(ns1 + "TemplatePartSKU", item.TemplatePartSKU),
                    new XElement(ns1 + "TemplateQuantity", item.TemplateQuantity)
                )
            )
        );
    }

这会产生这样的XML。

<ns1:TemplateParameters>
  <ns1:TemplateOrderLines>
    <ns1:TemplatePartDesc/>
    <ns1:TemplatePartSKU>NSD-CH02</ns1:TemplatePartSKU>
    <ns1:TemplateQuantity>2</ns1:TemplateQuantity>
  </ns1:TemplateOrderLines>
  <ns1:TemplateOrderLines>
    <ns1:TemplatePartDesc/>
    <ns1:TemplatePartSKU>NSD-TK02</ns1:TemplatePartSKU>
    <ns1:TemplateQuantity>1</ns1:TemplateQuantity>
  </ns1:TemplateOrderLines>
</ns1:TemplateParameters>

这是我想要的:

<TemplateParameters>
      <TemplateOrderLines>
        <item0>
          <TemplatePartDesc/>
          <TemplatePartSKU>NSC-CH02</TemplatePartSKU>
          <TemplateQuantity>5</TemplateQuantity>
        </item0>
        <item1>
          <TemplatePartDesc/>
          <TemplatePartSKU>NSC-TK02</TemplatePartSKU>
          <TemplateQuantity>5</TemplateQuantity>
        </item1>
      </TemplateOrderLines>
    </TemplateParameters>

如何修改代码以生成<item0> <item1>部分?

P.S。我知道<ns1:TemplateOrderLines>的重复。我知道如何解决这个问题,所以我现在不必担心。

这是一个类似的问题Use for loop when writing a XML file with LINQ

1 个答案:

答案 0 :(得分:0)

.Select有一个重载,它接受一个Func并将当前可枚举内的索引作为索引,因此您可以这样编写:

return new XElement(ns1 + "TemplateParameters",
    new XElement(ns1 + "TemplateOrderLines",
        templateOrderLines.Select((item, index) => 
            new XElement($"Item{index}",
                new XElement(ns1 + "TemplatePartDesc", item.TemplatePartDesc),
                new XElement(ns1 + "TemplatePartSKU", item.TemplatePartSKU),
                new XElement(ns1 + "TemplateQuantity", item.TemplateQuantity)
            )
        )
    )
);

但是请注意,正如@AlexanderPetrov在他的comment中指出的那样,很难像这样编写XML。很难找到多个以相同字符串开头的标签(在这种情况下为Item)。如果确实需要,请将索引添加为属性。

但是请记住,当使用LINQ解析XML时,您可以使用相同的重载来获取可枚举的索引,因此您根本不需要将索引嵌入数据中。