如何从xml文档中删除特定节点?

use*_*170 3 c# xml

我有xml以下的结构.我想删除一个完整的节点<ColumnValues>USD</ColumnValues>

<TableValue>
    <Columns>
        <ColumnName>Currency</ColumnName>
        <ColumnType>String</ColumnType>
        <ColumnValues>USD</ColumnValues>
        <ColumnValues>USD</ColumnValues>
    </Columns>
    <Columns>
        <ColumnName>Exchange</ColumnName>
        <ColumnType>String</ColumnType>
        <ColumnValues>US</ColumnValues>
        <ColumnValues>US</ColumnValues>
    </Columns>
    <Columns>
        <ColumnName>Ticker</ColumnName>
        <ColumnType>String</ColumnType>
        <ColumnValues>C</ColumnValues>
        <ColumnValues>AAPL</ColumnValues>
    </Columns>
</TableValue>
Run Code Online (Sandbox Code Playgroud)

为此,我使用下面的代码 -

XmlDocument doc = new XmlDocument();
doc.Load(@"C:\CASInputRequest_WOELN_Var1.xml");
XmlNodeList NodeTradeType = doc.GetElementsByTagName("ColumnValues");
NodeTradeType[0].RemoveAll();
doc.Save(@"C:\CASInputRequest_WOELN_Var1.xml");
Run Code Online (Sandbox Code Playgroud)

但它没有删除完整的节点.输出就像这样 -

<TableValue>
    <Columns>
        <ColumnName>Currency</ColumnName>
        <ColumnType>String</ColumnType>
        <ColumnValues>
        </ColumnValues>
        <ColumnValues>USD</ColumnValues>
    </Columns>
    <Columns>
        <ColumnName>Exchange</ColumnName>
        <ColumnType>String</ColumnType>
        <ColumnValues>US</ColumnValues>
        <ColumnValues>US</ColumnValues>
    </Columns>
    <Columns>
        <ColumnName>Ticker</ColumnName>
        <ColumnType>String</ColumnType>
        <ColumnValues>C</ColumnValues>
        <ColumnValues>AAPL</ColumnValues>
    </Columns>
</TableValue>
Run Code Online (Sandbox Code Playgroud)

请建议如何从xml中完全删除特定节点?

Jon*_*eet 14

Odd as is sounds, there's no method on XmlNode which will remove that node from the document. You need to ask the node's parent to remove the node:

XmlDocument doc = new XmlDocument();
doc.Load(@"C:\CASInputRequest_WOELN_Var1.xml");
XmlNodeList nodes = doc.GetElementsByTagName("ColumnValues");
XmlNode node = nodes[0];
node.ParentNode.RemoveChild(node);
doc.Save(@"C:\CASInputRequest_WOELN_Var1.xml");
Run Code Online (Sandbox Code Playgroud)

If you can use LINQ to XML life will be easier though. For example, to remove all ColumnValues nodes you'd just use:

XDocument doc = XDocument.Load(@"C:\CASInputRequest_WOELN_Var1.xml");
doc.Descendants("ColumnValues").Remove();
doc.Save(@"C:\CASInputRequest_WOELN_Var1.xml");
Run Code Online (Sandbox Code Playgroud)

Or just the first one:

XDocument doc = XDocument.Load(@"C:\CASInputRequest_WOELN_Var1.xml");
doc.Descendants("ColumnValues").First().Remove();
doc.Save(@"C:\CASInputRequest_WOELN_Var1.xml");
Run Code Online (Sandbox Code Playgroud)

  • @ilansch:因为在`XmlNode`上有一个`Remove`操作更加明智,它会从文档中删除它 - 就像在LINQ to XML中一样. (3认同)