none
XML如何單獨刪除多個相同名稱的子節點 RRS feed

  • 問題

  • 各位先進好

    關於XML我有個問題

    當一父節點裡面有數個相同名稱的子節點

    我該用甚麼辦法去判斷子節點的InnerText,並且刪除特定的子節點呢?

    例如部分的XML格式如下:

     <EventContainer LastUpdate="2012-10-29 22:05:07">
        <Event>event;ca64b496-a6c5-411a-b87e-ecca7e30db9d</Event>
        <Event>event;dcc8ffe4-098f-4e80-b435-8c18a67c7eec</Event>
      </EventContainer>

    有兩個重複名稱但是內容不同的子節點

    我今天想刪除event;ca64b496-a6c5-411a-b87e-ecca7e30db9d為內容的子節點

    有什麼辦法能辦到嗎?

    我試過

    nodelist = XMLroot.SelectNodes("EventContainer");
    
    
    foreach (XmlNode inode in nodelist)
                            {
                              
                                if (inode["Event"].InnerText == sDelEvent_ID)
                                {
                                    
                                  inode.ParentNode.RemoveChild(inode);
                                   
                                }

    但是他會把所有Event為名稱的子節點全部刪光光...

    還有試過

    nodelist = XMLroot.SelectSingleNode("UserElement/EventContainer").ChildNodes;
                      
                            for (int J = 0; J < nodelist.Count; ++J) 
                            {
                                if (nodelist.Item(i).InnerText == sDelEvent_ID)
                                {
                                    nodelist.Item(i).RemoveAll();
                             }}
                                

    變成會留下<Event></Event>的空節點...

    但都不能達到完整把該節點移除的效果

    請問各位我該如何去單獨移除他呢?

    謝謝

    2012年10月29日 下午 03:23

解答

  • 各位先進好

    關於XML我有個問題

    當一父節點裡面有數個相同名稱的子節點

    我該用甚麼辦法去判斷子節點的InnerText,並且刪除特定的子節點呢?

    例如部分的XML格式如下:

     <EventContainer LastUpdate="2012-10-29 22:05:07">
        <Event>event;ca64b496-a6c5-411a-b87e-ecca7e30db9d</Event>
        <Event>event;dcc8ffe4-098f-4e80-b435-8c18a67c7eec</Event>
      </EventContainer>

    有兩個重複名稱但是內容不同的子節點

    我今天想刪除event;ca64b496-a6c5-411a-b87e-ecca7e30db9d為內容的子節點

    有什麼辦法能辦到嗎?

    我試過

    nodelist = XMLroot.SelectNodes("EventContainer");
    
    
    foreach (XmlNode inode in nodelist)
                            {
                              
                                if (inode["Event"].InnerText == sDelEvent_ID)
                                {
                                    
                                  inode.ParentNode.RemoveChild(inode);
                                   
                                }

    但是他會把所有Event為名稱的子節點全部刪光光...

    還有試過

    nodelist = XMLroot.SelectSingleNode("UserElement/EventContainer").ChildNodes;
                      
                            for (int J = 0; J < nodelist.Count; ++J) 
                            {
                                if (nodelist.Item(i).InnerText == sDelEvent_ID)
                                {
                                    nodelist.Item(i).RemoveAll();
                             }}
                                

    變成會留下<Event></Event>的空節點...

    但都不能達到完整把該節點移除的效果

    請問各位我該如何去單獨移除他呢?

    謝謝

    哈哈不好意思,我剛剛吃完消夜突然想到一個折衷的辦法

    可能不是最佳解,但是確實有用,如果有其他高手可以提供更完整全面的寫法也請多多指教

    我的寫法是

    node = XMLroot.SelectSingleNode("EventContainer");
                        nodelist = rootCustomers.SelectNodes("Event");
    
                        for (int j = 0; j < nodelist.Count;j++ )
                        {
                            if (nodelist[j].InnerText.Equals(sDelEvent_ID))
                            {
                              rootCustomers.RemoveChild(nodelist[j]);
                            }
                        }

    花了3小時想盡辦法,最後休息一下吃個東西就解出來了...


    • 已編輯 THKAW 2012年10月29日 下午 04:18 路徑弄錯
    • 已標示為解答 THKAW 2012年10月31日 下午 05:29
    2012年10月29日 下午 04:17
  • 您好,

    請參考,

    Remove Duplicate Nodes in XML

    或是可以使用Linq找出不重覆的Element,如下,
    Xml Linq, removing duplicate nodes in XElement C#


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/


    2012年10月30日 上午 03:13

所有回覆

  • 各位先進好

    關於XML我有個問題

    當一父節點裡面有數個相同名稱的子節點

    我該用甚麼辦法去判斷子節點的InnerText,並且刪除特定的子節點呢?

    例如部分的XML格式如下:

     <EventContainer LastUpdate="2012-10-29 22:05:07">
        <Event>event;ca64b496-a6c5-411a-b87e-ecca7e30db9d</Event>
        <Event>event;dcc8ffe4-098f-4e80-b435-8c18a67c7eec</Event>
      </EventContainer>

    有兩個重複名稱但是內容不同的子節點

    我今天想刪除event;ca64b496-a6c5-411a-b87e-ecca7e30db9d為內容的子節點

    有什麼辦法能辦到嗎?

    我試過

    nodelist = XMLroot.SelectNodes("EventContainer");
    
    
    foreach (XmlNode inode in nodelist)
                            {
                              
                                if (inode["Event"].InnerText == sDelEvent_ID)
                                {
                                    
                                  inode.ParentNode.RemoveChild(inode);
                                   
                                }

    但是他會把所有Event為名稱的子節點全部刪光光...

    還有試過

    nodelist = XMLroot.SelectSingleNode("UserElement/EventContainer").ChildNodes;
                      
                            for (int J = 0; J < nodelist.Count; ++J) 
                            {
                                if (nodelist.Item(i).InnerText == sDelEvent_ID)
                                {
                                    nodelist.Item(i).RemoveAll();
                             }}
                                

    變成會留下<Event></Event>的空節點...

    但都不能達到完整把該節點移除的效果

    請問各位我該如何去單獨移除他呢?

    謝謝

    哈哈不好意思,我剛剛吃完消夜突然想到一個折衷的辦法

    可能不是最佳解,但是確實有用,如果有其他高手可以提供更完整全面的寫法也請多多指教

    我的寫法是

    node = XMLroot.SelectSingleNode("EventContainer");
                        nodelist = rootCustomers.SelectNodes("Event");
    
                        for (int j = 0; j < nodelist.Count;j++ )
                        {
                            if (nodelist[j].InnerText.Equals(sDelEvent_ID))
                            {
                              rootCustomers.RemoveChild(nodelist[j]);
                            }
                        }

    花了3小時想盡辦法,最後休息一下吃個東西就解出來了...


    • 已編輯 THKAW 2012年10月29日 下午 04:18 路徑弄錯
    • 已標示為解答 THKAW 2012年10月31日 下午 05:29
    2012年10月29日 下午 04:17
  • 您好,

    請參考,

    Remove Duplicate Nodes in XML

    或是可以使用Linq找出不重覆的Element,如下,
    Xml Linq, removing duplicate nodes in XElement C#


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/


    2012年10月30日 上午 03:13
  • 您好,

    請參考,

    Remove Duplicate Nodes in XML

    或是可以使用Linq找出不重覆的Element,如下,
    Xml Linq, removing duplicate nodes in XElement C#


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/


    第一種方式裡面不用LINQ的做法跟我有點類似,直接去if innertext的內容來比對

    因為其他部分已經弄傳統PARSER去解

    突然轉LINQ還不熟悉,要不然看一看很多解法似乎都是LINQ方便而且簡化很多

    而且好像如果他們有重複的CHILD ELENET名稱,通常都會附帶屬性去做查詢

    目前沒看到LINQ去比對Innertext的相關範例跟用法就是了

    謝謝你的意見~~


    2012年10月31日 下午 05:35
  • 您好,
    您可以參考一下,以下的方式,試看看哦!

    What is the equivalent to InnerText in LINQ-to-XML?
    How can I get an XElement's innertext in Linq to XML?


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年11月1日 上午 02:03