修改 XML 檔案

要使用 XDocument 修改 XML 檔案,可以將檔案載入到 XDocument 型別的變數中,在記憶體中修改它,然後儲存它,覆蓋原始檔案。一個常見的錯誤是修改記憶體中的 XML 並期望磁碟上的檔案發生變化。

給定一個 XML 檔案:

<?xml version="1.0" encoding="utf-8"?>
<FruitBasket xmlns="http://www.fruitauthority.fake">
  <Fruit>
    <FruitName>Banana</FruitName>
    <FruitColor>Yellow</FruitColor>
  </Fruit>
  <Fruit>
    <FruitName>Apple</FruitName>
    <FruitColor>Red</FruitColor>
  </Fruit>
</FruitBasket>

你想將香蕉的顏色修改為棕色:

  1. 我們需要知道磁碟上檔案的路徑。
  2. XDocument.Load 的一個過載接收 URI(檔案路徑)。
  3. 由於 xml 檔案使用名稱空間,因此我們必須使用名稱空間 AND 元素名稱進行查詢。
  4. 使用 C#6 語法的 Linq 查詢以適應空值的可能性。如果條件沒有找到任何元素,則此查詢中使用的每個 . 都有可能返回空集。在 C#6 之前,你將分多步執行此操作,並在此過程中檢查 null。結果是含有香蕉的 <Fruit> 元素。實際上是一個 IEnumerable<XElement>,這就是下一步使用 FirstOfDefault() 的原因。
  5. 現在我們從剛剛找到的 Fruit 元素中提取 FruitColor 元素。在這裡我們假設只有一個,或者我們只關心第一個。
  6. 如果它不為 null,我們將 FruitColor 設定為 Brown
  7. 最後,我們儲存 XDocument,覆蓋磁碟上的原始檔案。
// 1.
string xmlFilePath = "c:\\users\\public\\fruit.xml";

// 2.
XDocument xdoc = XDocument.Load(xmlFilePath);

// 3.
XNamespace ns = "http://www.fruitauthority.fake";

//4. 
var elBanana = xdoc.Descendants()?.
    Elements(ns + "FruitName")?.
    Where(x => x.Value == "Banana")?.
    Ancestors(ns + "Fruit");

// 5.
var elColor = elBanana.Elements(ns + "FruitColor").FirstOrDefault();

// 6.
if (elColor != null)
{
    elColor.Value = "Brown";
}

// 7.
xdoc.Save(xmlFilePath);

該檔案現在看起來像這樣:

<?xml version="1.0" encoding="utf-8"?>
<FruitBasket xmlns="http://www.fruitauthority.fake">
  <Fruit>
    <FruitName>Banana</FruitName>
    <FruitColor>Brown</FruitColor>
  </Fruit>
  <Fruit>
    <FruitName>Apple</FruitName>
    <FruitColor>Red</FruitColor>
  </Fruit>
</FruitBasket>