2013-07-04 5 views
3

У меня есть структура xml. Я хочу, чтобы удалить полный узел <ColumnValues>USD</ColumnValues>Как удалить определенный узел из XML-документа?

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

Для этого я использую ниже код -

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

но не вынимая полный узел. Выход идет следующим образом:

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

Пожалуйста, предложите, как полностью удалить определенный узел из xml?

+3

возможность использовать LINQ к XML, кстати Вы? Это обычно делает XML более приятным. –

+0

Соответствующие документы: [MSDN - 'System.Xml.XmlNode'] (http://msdn.microsoft.com/en-us/library/system.xml.xmlnode.aspx) –

ответ

14

Нечетный как звуки, нет метода на 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"); 

Если вы можете использовать LINQ к XML жизни будет легче, хотя. Например, чтобы удалить все узлы ColumnValues вы бы просто использовать:

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

или просто первый:

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

Почему это странно для вас? – ilansch

+3

@ilansch: Потому что было бы разумнее, если бы была операция «Удалить» на «XmlNode», которая удалилась бы из документа - точно так же, как в LINQ to XML. –

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