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

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

  •  0
  • Yagzii  · 技术社区  · 10 年前

    我有一个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 回复  |  直到 10 年前
        1
  •  1
  •   Sergey Berezovskiy    10 年前

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

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