linq 从父节点中移除所有子节点,只有一个特定的子节点(c#中的xml)除外,

zpf6vheq  于 2022-12-06  发布在  C#
关注(0)|答案(3)|浏览(192)

这是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>
daupos2t

daupos2t1#

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

说明:

  • doc.Descendants("row")-查找所有行元素,无论其深度如何。
  • Elements()-获取所有直接子元素
  • Where()-获取名称不是WarehouseCode的所有元素
  • Remove()-删除所有找到的元素
wmtdaxz3

wmtdaxz32#

你不需要为每一行调用.Elements(),你已经得到了元素列表:

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

brgchamk3#

获取行,删除它。创建新行,添加该行的WarehouseCode,然后将该行添加到magaRow。如果这样做不起作用,我怀疑是命名空间导致了问题。

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

相关问题