我有此代码:
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>
的重复。我知道如何解决这个问题,所以我现在不必担心。
答案 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时,您可以使用相同的重载来获取可枚举的索引,因此您根本不需要将索引嵌入数据中。