2013-07-04 4 views
3

아래 XML 구조가 있습니다.XML 문서에서 특정 노드를 삭제하는 방법은 무엇입니까?

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

하지만 제거 완료되지 노드 - 나는 완전한 노드 내가 코드를 아래에 사용하고이를 위해 <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> 

을 삭제합니다. 출력은 다음과 같습니다. -

<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

있습니까? 일반적으로 XML을 처리하는 것이 더 즐겁습니다. –

+0

관련 문서 : [MSDN -'System.Xml.XmlNode'] (http://msdn.microsoft.com/en-us/library/system.xml.xmlnode.aspx) –

답변

14

이상하게 들리지만, XmlNode에는 문서에서 노드를 제거 할 방법이 없습니다. 노드의 부모에게 노드를 제거하도록 요청해야합니다. LINQ to XML을 사용하면 쉽게 사용할 수 있습니다.

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

을하거나 첫 번째 : 예를 들어, 당신은 그냥 사용하는 것 모두 ColumnValues 노드를 제거하는 방법은 방법으로, XML에 LINQ를 사용할 수

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 : LINQ to XML에있는 것처럼, XmlNode에서 문서에서 자신을 제거하는 'Remove'연산이 더 현명 할 것이기 때문에. –

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> 
관련 문제