簡體   English   中英

使用 c# 從 xml 中刪除節點

[英]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 告訴我RootAttribute("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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM