[英]Deleting nodes from xml with c#
我有一個 xml 文件。 它包含如下示例中的記錄。
<Simulator>
<Flight ID="1" Description="1sunny" Date="2022-09-09">
<Instructor Num="6">
<Name>matt</Name>
<Surname>matt</Surname>
<Rank>matt</Rank>
</Instructor>
</Flight>
</Simulator>
當我使用刪除 function 刪除它時,我看到了這樣的結果,這個結果破壞了我的自動生成 id function。 我怎樣才能完全刪除航班標簽?
<Simulator>
<Flight />
</Simulator>
刪除 function
private void b_delete_Click(object sender, EventArgs e)
{
var xDoc = XDocument.Load(input);
foreach (var elem in xDoc.Document.Descendants("Flight"))
{
foreach (var attr in elem.Attributes("ID"))
{
if (attr.Value.Equals("1"))
elem.RemoveAll();
}
}
xDoc.Save(input);
MessageBox.Show("Deleted Successfully");
}
您可以使用 LINQ Where
擴展方法獲得正確的元素,而不是使用循環。 這就是XDocument
內容位於System.Xml.Linq 命名空間中的原因
(我正在使用 C# 11 的原始字符串功能進行此測試):
string xml = """
<Simulator>
<Flight ID="1" Description="1sunny" Date="2022-09-09">
<Instructor Num="6">
<Name>matt</Name>
<Surname>matt</Surname>
<Rank>matt</Rank>
</Instructor>
</Flight>
</Simulator>
""";
var xDoc = XDocument.Parse(xml);
xDoc.Root?.Descendants("Flight")
.Where(f => f.Attribute("ID")?.Value == "1")
.Remove();
Console.WriteLine(xDoc);
印刷:
<Simulator />
IntelliSense 告訴我Root
和Attribute("ID")
可以是 null。 因此我使用了C# Null-Conditional Operator (? Operator) 。
如果您只想刪除一個元素,可以使用FirstOrDefault
而不是Where
來加快該過程:
xDoc.Root?.Descendants("Flight")
.FirstOrDefault(f => f.Attribute("ID")?.Value == "1")
?.Remove();
這將在找到的第一個元素處停止循環。 這需要另一個?
因為如果沒有找到匹配的元素, FirstOrDefault
將返回null
,而Where
返回一個空枚舉。
請注意, Where
正在使用的地方
public static void Remove<T>(this IEnumerable<T?> source) where T : XNode;
使用T
作為XElement
,但使用FirstOrDefault
我們調用XNode.Remove();
方法。
只需對Descendants
方法的結果使用Remove
擴展方法:
using System.Xml.Linq;
var xDoc = XDocument.Load(input);
xDoc.Document.Descendants("Flight")
.Remove();
using var writer = new FileStream(output, FileMode.Append);
xDoc.Save(writer);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.