【问题标题】:adding item index in xml with Linq使用 Linq 在 xml 中添加项目索引
【发布时间】:2018-08-06 02:27:15
【问题描述】:

我有这个代码:

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>

如何修改我的代码以生成 &lt;item0&gt; &lt;item1&gt; 部分?

附:我知道&lt;ns1:TemplateOrderLines&gt; 重复。我知道如何解决这个问题,所以我现在不担心那一点。

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

【问题讨论】:

  • 到目前为止你有什么努力吗?
  • 我用谷歌搜索但没有找到答案。我想我没有使用正确的搜索。如果您对我应该搜索的内容有任何想法,那也会有所帮助。
  • 此类 XML:item{N} - 难以解析和处理。不要使用它!在极端情况下,添加IdIndex 属性。

标签: c# xml linq


【解决方案1】:

.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 时,您可以使用相同的重载来获取可枚举的索引,因此您可能根本不需要在数据中嵌入索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多