2016-05-04 24 views
0

ユーザーから情報を取得してXMLファイルとして保存するプログラムを作成しています。情報には、名前やその他の詳細が含まれます。ユーザーが同じ名前を入力できるようにしたいと思います。同じ名前で新しい要素を作成するのではなく、既存の要素を新しい値で上書きします。C#でXML要素を上書き/編集する方法

ジョンスミスという名前を入力して250を入力した場合の例はありません。ただし、誤植を変更したいと思いますので、私がこれをすると、別のJohn Smithを追加するための新しい要素が作成されます。既存の要素を編集/上書きする方法はありますか?何か助けがあればXMLを作成するために使用するコードを投稿します!

ありがとうございます!

XDocument Xdoc = new XDocument(new XElement("XMLFile")); 
     if (System.IO.File.Exists(filepath)) 
     { 
      Xdoc = XDocument.Load(filepath); 
     } 
     else 
     { 
      Xdoc = new XDocument(); 
     } 

     XElement xml = new XElement("Member"); 
     xml.Add(new XElement("Name", txtName.Text)); 
     xml.Add(new XElement("Age", txtAge.Text)); 
     xml.Add(new XElement("Nationality", txtNationality.Text)); 
     xml.Add(new XElement("EmailAddress", txtEmailAddress.Text)); 
     xml.Add(new XElement("ContactNumber", txtContactNumber.Text)); 


     if (Xdoc.Descendants().Count() > 0) 
     { 
      Xdoc.Descendants().First().Add(xml); 
     } 
     else 
     { 
      Xdoc.Add(xml); 
     } 

     Xdoc.Save(filepath); 

答えて

0

.Valueプロパティを使用して、必要な要素を取得して値を設定できます。

コードに大きなバグがあることに注意してください。ドキュメントが最初に空の場合は、最初のMemberをドキュメントのルート要素として追加した後、追加のMembersをすべてという最初のメンバーの子として追加します

ここでは、更新を行い、新しいメンバーを正しく追加する正しいコードを示します。

XDocument Xdoc; 

if (System.IO.File.Exists(filepath)) 
{ 
    Xdoc = XDocument.Load(filepath); 
} 
else 
{ 
    Xdoc = new XDocument(new XElement("Members")); 
} 

XElement member = Xdoc 
    .Descendants("Member") 
    .FirstOrDefault(m => (string) m.Element("Name") == name); 

if (member != null) 
{ 
    member.Element("Age").Value = age; 
    member.Element("Nationality").Value = age; 
    member.Element("EmailAddress").Value = age; 
    member.Element("ContactNumber").Value = age; 
} 
else 
{ 
    XElement newMember = new XElement("Member", 
     new XElement("Name", name), 
     new XElement("Age", age), 
     new XElement("Nationality", nationality), 
     new XElement("EmailAddress", email), 
     new XElement("ContactNumber", contactNumber) 
     ); 

    Xdoc.Descendants("Members").First().Add(newMember); 
} 

Xdoc.Save(filepath); 
+0

これは、感謝しました! :) – Jamie

0

があります。あなたは、あなたのXMLを読み込むその名前が存在するかどうかに基づいて、アクションの2つの発散パスを作成し、XMLの保存にバックパスをマージする場合:

XDocument Xdoc = new XDocument(new XElement("XMLFile")); 
if (System.IO.File.Exists(filepath)) 
{ 
    Xdoc = XDocument.Load(filepath); 
} 
else 
{ 
    Xdoc = new XDocument(); 
} 

var existing = Xdoc.Descendants("Member").FirstOrDefault(m => m.Element("Name")?.Value == txtName.Text); 

if (existing != null) //name existed in xml 
{ 
     existing.Element("Age").Value = txtAge.Text; 
     //.... 
     //.... 
} 
else 
{ 
     XElement xml = new XElement("Member"); 
     xml.Add(new XElement("Name", txtName.Text)); 
     xml.Add(new XElement("Age", txtAge.Text)); 
     xml.Add(new XElement("Nationality", txtNationality.Text)); 
     xml.Add(new XElement("EmailAddress", txtEmailAddress.Text)); 
     xml.Add(new XElement("ContactNumber", txtContactNumber.Text)); 

     if (Xdoc.Descendants().Count() > 0) 
     { 
      Xdoc.Descendants().First().Add(xml); 
     } 
     else 
     { 
      Xdoc.Add(xml); 
     } 
} 

Xdoc.Save(filepath)); 
+0

これは完璧に、ありがとう! – Jamie

0

使用XElement.SetElementValue(element, value)

例:

xml.SetElementValue("Age", 25); 

この場合はやり過ぎのように聞こえるあなたはこのことについて行くことができるもう一つの方法は、これです: どのようにして反復処理を最初のHashMap内の要素名とその値を格納し、約HashMapを使用してXML要素を作成します。誰かが値を編集しているときに、プロセスを元に戻します。したがって、誰かが編集を行うたびに、要素をHashMapにダンプし、要素の値を更新してからxml要素を再作成します。

+0

テキストボックスから入力する値を探していました。申し訳ありませんが、私はそれを述べておきました。とにかく、それは今でもソートされました! :) – Jamie

関連する問題