从父级删除所有子级节点,除了一个特定的C#中的xml

时间:2018-11-16 14:22:43

标签: c# xml linq

这是Xml

 <ItemWarehouseInfo>
      <row>
        <MinimalStock>0.000000</MinimalStock>
        <MaximalStock>0.000000</MaximalStock>
        <MinimalOrder>0.000000</MinimalOrder>
        <StandardAveragePrice>0.000000</StandardAveragePrice>
        <Locked>tNO</Locked>
        <WarehouseCode>Mc</WarehouseCode>
        <DefaultBinEnforced>tNO</DefaultBinEnforced>
      </row>
      ...other equal lines
    </ItemWarehouseInfo>

除了WarehouseCode节点之外,我必须从每个行节点中删除所有子节点 我尝试了这种方法,但显然我错了,没有任何变化:

    XDocument xdoc = XmlHelper.LoadXDocFromString(xmlOITM);
XElement magaRow = xdoc.Root.Descendants(Constants.Articoli.ART_MAGA_NODES).FirstOrDefault();//ItemWarehouseInfo node
List<XElement> row = magaRow.Elements().ToList();//row node
foreach(XElement child in row.Elements())
{
    if (child.Name != "WarehouseCode")
    {
        child.Remove();
    }
}

这是我期望的最终结果:

<ItemWarehouseInfo>
      <row>
        <WarehouseCode>Mc</WarehouseCode>
      </row>
      ...other equal lines
</ItemWarehouseInfo>

3 个答案:

答案 0 :(得分:1)

doc.Descendants("row").Elements().Where(e => e.Name != "WarehouseCode").Remove();

说明:

  • doc.Descendants("row")-查找所有行元素,无论它们有多深。

  • Elements()-获取所有直接子元素

  • Where()-获取所有名称不是WarehouseCode

  • 的元素
  • Remove()-删除所有找到的元素

答案 1 :(得分:0)

您无需为每一行调用.Elements(),您已经获得了元素列表:

foreach(XElement child in row)
{
    if (child.Name != "WarehouseCode")
    {
        child.Remove();
    }
}

答案 2 :(得分:0)

获取行,将其删除。创建新行,添加该行的WarehouseCode,然后将该行添加到magaRow。如果这不起作用,我怀疑名称空间会引起问题。

XElement row = magaRow.Element("row");
row.Remove();
XElement newRow = new XElement("row");
newRow.Add(row.Element("WarehouseCode"));
magaRow.Add(newRow);