2013-10-30 106 views
2

我有一個XML文件。我想刪除沒有任何後代的line_item節點。刪除沒有後代的XML節點

<root> 
    <transaction> 
    <type>regular</type> 
    <number>746576</number> 
    <customer> 
     <mobile>5771070</mobile> 
     <email /> 
     <name>abcd</name> 
    </customer> 
    <line_items> 
     <line_item> 
     <serial>8538</serial> 
     <amount>220</amount> 
     <description>Veggie </description> 
     <qty>1</qty> 
     <attributes /> 
     </line_item> 
     <line_item /> 
     <line_item /> 
     <line_item /> 
     <line_item /> 
     <line_item> 
     <serial>8543</serial> 
     <description>Tax</description> 
     <qty>1</qty> 
     <value>42.78</value> 
     <attributes /> 
     </line_item> 
    </line_items> 
    <associate_details> 
     <code>660</code> 
     <name>xyz</name> 
    </associate_details> 
    </transaction> 
</root> 

我正在使用ASP.NET 4.現在我正在查找line_item節點並檢查它是否包含元素。

+3

歡迎來到StackOverflow!你有什麼嘗試?你卡在哪裏?你正在使用LINQ到XML或System.Xml類嗎? – Heinzi

回答

1

只是複製亞歷克斯Filipovici的回答,帶着幾分修改:

var xDoc = XDocument.Load("input.xml"); 
    xDoc.Descendants() 
     .Where(d => d.Name.LocalName == "line_item" && !d.HasElements) 
     .ToList() 
     .ForEach(e => e.Remove()); 
0

試試這個:

using System.Linq; 
using System.Xml.Linq; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var xDoc = XDocument.Load("input.xml"); 
     xDoc.Descendants() 
      .Where(d => 
       d.Name.LocalName == "line_item" && 
       d.Elements().Count() == 0) 
      .ToList() 
      .ForEach(e => e.Remove()); 

     // TODO: 
     //xDoc.Save(savePath); 
    } 
} 

更短,速度更快的替代方法是使用下面的語法:

xDoc.Descendants("line_item") 
    .Where(d => !d.HasElements) 
    .ToList() 
    .ForEach(e => e.Remove()); 
+0

請解釋反對票。 –