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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/17462698/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-10 09:32:42  来源:igfitidea点击:

How to delete a particular node from xml document?

c#xml

提问by user2318170

I have below xml structure. I want delete a complete node <ColumnValues>USD</ColumnValues>

我有以下 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>

For this I am using below code -

为此,我使用以下代码 -

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

but its not removing complete node. The output is coming like this -

但它没有删除完整的节点。输出是这样的 -

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

Please suggest, how to completely delete a particular node from xml?

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

回答by Jon Skeet

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

听起来很奇怪,没有方法XmlNode可以从文档中删除该节点。您需要要求节点的父节点删除该节点:

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

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

如果您可以使用 LINQ to XML,生活会更轻松。例如,要删除ColumnValues您只使用的所有节点:

XDocument doc = XDocument.Load(@"C:\CASInputRequest_WOELN_Var1.xml");
doc.Descendants("ColumnValues").Remove();
doc.Save(@"C:\CASInputRequest_WOELN_Var1.xml");

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

回答by Ranjith Kumar

 public void RemovePendingMessage(String message, String AdapterType, Configuration.Adapter xmlAdapterConfiguration, String traceSchedulerName, Int64 CorrelationID)
        {
            try
            {
                XmlNode docNode = null;
                XmlDocument xmlDoc = new XmlDocument();
                XmlDocument xdoc = new XmlDocument();
                String date = String.Empty;
                string strValue = string.Empty;
                if (File.Exists(@"C:\Temp\UnsendMessages.xml"))
                {
                    xmlDoc.Load(@"C:\Temp\UnsendMessages.xml");
                    XmlNode Unsendmessages = xmlDoc.DocumentElement;
                    XPathNavigator navigator = xmlDoc.CreateNavigator();
                    xdoc.LoadXml(message);                    

                    using (XmlReader reader = XmlReader.Create(new StringReader(message)))
                    {
                        reader.ReadToFollowing("Adapter");
                        reader.MoveToContent();
                        strValue = reader.GetAttribute("timestamp");                         
                    }

                    if (strValue != null)
                    {
                        docNode = xmlDoc.SelectSingleNode("//Adapter[@timestamp='" + strValue.ToString() +"' and @type='" + AdapterType.ToString() + "']");
                        docNode.RemoveAll();                     
                    }
                 xmlDoc.Save(@"C:\Temp\UnsendMessages.xml");
                }
            }
            catch (Exception ex)
            {

            }
        }
-------------------------------------------------------------
<?xml version="1.0" encoding="utf-8"?>
<Unsendmessages>
  <Adapter>
  </Adapter>
  <Adapter type="XMLAdapter" timestamp="2014-10-15 16:48:02Z">
    <Resendmessage>
      <WMRP_ORDERS>
        <ORDERSCONTRACTNO>C0017</ORDERSCONTRACTNO>
        <ORDERS_STATUSID>17</ORDERS_STATUSID>
        <ORDERSDATERECEIVED>9/2/2014 12:00:00 AM</ORDERSDATERECEIVED>
        <ORDERS_BT_ORDER_NO>O0017</ORDERS_BT_ORDER_NO>
        <ORDERS_REGION_CODE>17</ORDERS_REGION_CODE>
        <ORDERSSCHEDULEDSTARTDATE>9/2/2014 12:00:00 AM</ORDERSSCHEDULEDSTARTDATE>
        <ORDERSSCHEDULEDENDDATE>9/10/2014 12:00:00 AM</ORDERSSCHEDULEDENDDATE>
      </WMRP_ORDERS>
    </Resendmessage>
  </Adapter>
  <Adapter type="XMLAdapter" timestamp="2014-10-15 16:47:32Z">
    <Resendmessage>
      <WMRP_ORDERS>
        <ORDERSCONTRACTNO>C0016</ORDERSCONTRACTNO>
        <ORDERS_STATUSID>16</ORDERS_STATUSID>
        <ORDERSDATERECEIVED>9/2/2014 12:00:00 AM</ORDERSDATERECEIVED>
        <ORDERS_BT_ORDER_NO>O0016</ORDERS_BT_ORDER_NO>
        <ORDERS_REGION_CODE>16</ORDERS_REGION_CODE>
        <ORDERSSCHEDULEDSTARTDATE>9/2/2014 12:00:00 AM</ORDERSSCHEDULEDSTARTDATE>
        <ORDERSSCHEDULEDENDDATE>9/10/2014 12:00:00 AM</ORDERSSCHEDULEDENDDATE>
      </WMRP_ORDERS>
    </Resendmessage>
  </Adapter>
  <Adapter type="XMLAdapter" timestamp="2014-10-15 16:46:58Z">
    <Resendmessage>
      <WMRP_ORDERS>
        <ORDERSCONTRACTNO>C0017</ORDERSCONTRACTNO>
        <ORDERS_STATUSID>17</ORDERS_STATUSID>
        <ORDERSDATERECEIVED>9/2/2014 12:00:00 AM</ORDERSDATERECEIVED>
        <ORDERS_BT_ORDER_NO>O0017</ORDERS_BT_ORDER_NO>
        <ORDERS_REGION_CODE>17</ORDERS_REGION_CODE>
        <ORDERSSCHEDULEDSTARTDATE>9/2/2014 12:00:00 AM</ORDERSSCHEDULEDSTARTDATE>
        <ORDERSSCHEDULEDENDDATE>9/10/2014 12:00:00 AM</ORDERSSCHEDULEDENDDATE>
      </WMRP_ORDERS>
    </Resendmessage>
  </Adapter>
  <Adapter type="XMLAdapter" timestamp="2014-10-15 16:46:25Z">
    <Resendmessage>
      <WMRP_ORDERS>
        <ORDERSCONTRACTNO>C0016</ORDERSCONTRACTNO>
        <ORDERS_STATUSID>16</ORDERS_STATUSID>
        <ORDERSDATERECEIVED>9/2/2014 12:00:00 AM</ORDERSDATERECEIVED>
        <ORDERS_BT_ORDER_NO>O0016</ORDERS_BT_ORDER_NO>
        <ORDERS_REGION_CODE>16</ORDERS_REGION_CODE>
        <ORDERSSCHEDULEDSTARTDATE>9/2/2014 12:00:00 AM</ORDERSSCHEDULEDSTARTDATE>
        <ORDERSSCHEDULEDENDDATE>9/10/2014 12:00:00 AM</ORDERSSCHEDULEDENDDATE>
      </WMRP_ORDERS>
    </Resendmessage>
  </Adapter>
  <Adapter>
  </Adapter>
</Unsendmessages>