代码之家  ›  专栏  ›  技术社区  ›  codeNinja

使用Linq在xml中添加项索引

  •  -1
  • codeNinja  · 技术社区  · 8 年前

    我有这个密码:

    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)
                    )
                )
            );
        }
    

    <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>

    <ns1:TemplateOrderLines>

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

    1 回复  |  直到 8 年前
        1
  •  0
  •   Zev Spitz    8 年前

    .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)
                )
            )
        )
    );
    

    comment --这样编写的XML很难解析;很难找到以相同字符串开头的多个标记(在本例中) Item ). 如果确实需要,可以将索引添加为属性。

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