添加元素值等于n的XML节点

时间:2014-08-20 11:20:26

标签: c# xml linq linq-to-xml

我有一个类似

的XML文件
<?xml version="1.0" encoding="utf-8"?>
<Orders>
  <Order>
    <OrderNumber>123</OrderNumber>
    <ClientName>Name</ClientName>
    <TotalOrderCost>50</TotalOrderCost>
    <Products>
      <Product>
        <Name>Games</Name>
        <Quantity>3</Quantity>
        <Price>10</Price>
        <TotalProductPrice>30</TotalProductPrice>
      </Product>
      <Product>
        <Name>CDs</Name>
        <Quantity>2</Quantity>
        <Price>10</Price>
        <TotalProductPrice>10</TotalProductPrice>
      </Product>      
    </Products>
  </Order>
  <Order>
    <OrderNumber>456</OrderNumber>
    <ClientName>Name 2</ClientName>
    <TotalOrderPrice>15</TotalOrderPrice>
    <Products>
      <Product>
        <Name>Tea</Name>
        <Quantity>1</Quantity>
        <Price>15</Price>
        <TotalProductPrice>15</TotalProductPrice>
      </Product>
    </Products>
  </Order>
</Orders>

我有一个用户选择订单的表单,可以在其中添加更多产品。我可以输出正确的XElement,如下所示:

      <Product>
        <Name>Coffee</Name>
        <Quantity>1</Quantity>
        <Price>15</Price>
        <TotalProductPrice>15</TotalProductPrice>
      </Product>

如何在用户选择的订单产品下添加此XElement?因此,如果用户选择OrderNumer = 456并使用表单添加产品,则XElement将低于456。

我试过了:

xmldoc2.Element("Orders").Element("Order").Element("Products").Add(addProduct);
xmldoc2.Save(orderFilePath);

总是将产品添加到XML上的第一个订单,我可以看到它的原因但是我无法看到如何在所选订单下添加产品。

1 个答案:

答案 0 :(得分:1)

您应该选择要添加新产品的订单元素:

int number = 456;
var order = xmldoc2.Element("Orders").Element("Order")
                   .FirstOrDefault(o => (int)o.Element("OrderNumber") == number);

// check if order not null    
order.Element("Products").Add(addProduct);

您还可以使用XPath选择顺序:

var xpath = String.Format("//Order[OrderNumber[text()={0}]]", number);
var order = xmldoc2.XPathSelectElement(xpath);