XDocument と System.Xml.Linq 名前空間

# XML ドキュメントを生成

目標は、次の XML ドキュメントを生成することです:

<FruitBasket xmlns="http://www.fruitauthority.fake">
  <Fruit ID="F0001">
    <FruitName>Banana</FruitName>
    <FruitColor>Yellow</FruitColor>
  </Fruit>
  <Fruit ID="F0002">
    <FruitName>Apple</FruitName>
    <FruitColor>Red</FruitColor>
  </Fruit>
</FruitBasket>

コード:

XNamespace xns = "http://www.fruitauthority.fake";
XDeclaration xDeclaration = new XDeclaration("1.0", "utf-8", "yes");
XDocument xDoc = new XDocument(xDeclaration);
XElement xRoot = new XElement(xns + "FruitBasket");
xDoc.Add(xRoot);

XElement xelFruit1 = new XElement(xns + "Fruit");
XAttribute idAttribute1 = new XAttribute("ID", "F0001");
xelFruit1.Add(idAttribute1);
XElement xelFruitName1 = new XElement(xns + "FruitName", "Banana");
XElement xelFruitColor1 = new XElement(xns + "FruitColor", "Yellow");
xelFruit1.Add(xelFruitName1);
xelFruit1.Add(xelFruitColor1);
xRoot.Add(xelFruit1);

XElement xelFruit2 = new XElement(xns + "Fruit");
XAttribute idAttribute2 = new XAttribute("ID", "F0002");
xelFruit2.Add(idAttribute2);
XElement xelFruitName2 = new XElement(xns + "FruitName", "Apple");
XElement xelFruitColor2 = new XElement(xns + "FruitColor", "Red");
xelFruit2.Add(xelFruitName2);
xelFruit2.Add(xelFruitColor2);
xRoot.Add(xelFruit2);

# 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 の 1 つのオーバーロード URI (ファイル パス) を受け取ります。
  • xml ファイルは名前空間を使用するため、名前空間と要素名を使用してクエリを実行する必要があります。
  • C# 6 構文を使用して null 値の可能性に対応する Linq クエリ。 .ごと このクエリで使用される は、条件で要素が見つからない場合に null セットを返す可能性があります。 C# 6 より前は、これを複数の手順で実行し、途中で null をチェックしていました。結果は <Fruit> です バナナを含む要素。実際には IEnumerable<XElement> 、これが次のステップで FirstOfDefault() を使用する理由です .
  • ここで、見つけたばかりの Fruit 要素から FruitColor 要素を抽出します。ここでは、1 つしかないと仮定するか、最初の 1 つだけに注目します。
  • 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>
    
    

    # 流暢な構文を使用して XML ドキュメントを生成する

    目標:

    <FruitBasket xmlns="http://www.fruitauthority.fake">
      <Fruit>
        <FruitName>Banana</FruitName>
        <FruitColor>Yellow</FruitColor>
      </Fruit>
      <Fruit>
        <FruitName>Apple</FruitName>
        <FruitColor>Red</FruitColor>
      </Fruit>
    </FruitBasket>
    
    

    コード:

    XNamespace xns = "http://www.fruitauthority.fake";
    XDocument xDoc = 
        new XDocument(new XDeclaration("1.0", "utf-8", "yes"),
            new XElement(xns + "FruitBasket",
                new XElement(xns + "Fruit",
                    new XElement(xns + "FruitName", "Banana"),
                    new XElement(xns + "FruitColor", "Yellow")),
                new XElement(xns + "Fruit",
                    new XElement(xns + "FruitName", "Apple"),
                    new XElement(xns + "FruitColor", "Red"))
                    ));
    
    

    No