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