0

現在、LINQ を介して XML ドキュメントとの間でデータを保存および読み取る関数を作成しています。現在、ドキュメントは問題なく記述できますが、既存のアイテムにデータを追加しようとすると、新しいアイテムが追加されるだけです。私の目標は、住所録タイプのシステムを作成することです (はい、1000 種類あることは知っています。これは自分自身の学習プロジェクトです)。ini と基本的なテキストを試しましたが、XML を使用するのが最善の方法のようです。 SQLのようなローカルDB。現在私は持っています:

    XDocument doc = XDocument.Load(@"C:\TextXML.xml");
    var data = new XElement("Entry",
    new XElement("Name", textBox1.Text),
    new XElement("Address", richTextBox2.Text),
    new XElement("Comments", richTextBox1.Text));
    doc.Element("Contacts").Add(data);
    doc.Save(@"C:\TextXML.xml");

SOを検索しましたが、追加/置換する方法が見つからないようです。これで、ドキュメントに追加してもすべてが適切に保存されますが、エントリを更新したい場合、新しい「エントリ」を作成せずにどうすればよいかわかりませんし、削除するコツもわかりません。(私はまだC#に少し慣れておらず、独学であるため、見落としている明らかなものはすべてご容赦ください。)

2 つ目の問題は、情報をテキスト ボックスにロードすることです。エントリ名のリストをリストボックスにロードできますが、そのエントリから情報を開こうとすると、ネストされた情報を適切に取得する方法がわかりません。上記の例では、次のようなものが必要です。

XDocument doc = XDocument.Load(@"C:\TextXML.xml");
boxName.Text = The name from the SelectedItem of the list box.
boxAddress.Text = The address child of the element named above etc.

私が試した各メソッドは、null 参照例外で終わります。これは、正しいものを指していないことを示していますが、それらのものに適切に到達する方法がわかりません。また、リスト ボックスから SelectedItem の文字列varを作成して名前付けを支援し、ToString メソッドを使用しようとしましたが、まだわかりません。

4

1 に答える 1

0

値を置き換えるために、XElement で使用できる関数がいくつかあります。

Value (property with a public setter)
SetValue()
SetElementValue()
SetAttributeValue()
ReplaceWith()
ReplaceNodes()

たとえば、Name の値を置き換える場合は、次のようにします。

data.Element("Name").SetValue("NewValue");

また

data.Element("Name").Value = "NewValue";

ロードについては、必要な XElement ノードを取得したら、次のように簡単に実行できます。

xelement.Value

または属性の場合:

xelement.Attribute("AttributeName").Value

コードを例として使用します。

boxName.Text = doc.Element("Entry").Element("Name").Value;

コメントに対処するために編集:

私があなたのコメントを正しく読んでいれば、名前/住所などを抽出したいと思っています。Contacts メインノード内のすべてのノードからのデータ?

もしそうなら、おそらく次のようなものが欲しいでしょう:

boxName.Text = string.Join(",", doc.Elements("Entry").Select(x => x.Element("Name").Value));

これにより、すべてのエントリのすべての名前がカンマで区切られた単一の文字列が得られます。「名前」を「住所」に変更するだけで、住所についても同じことができます。

この解析の使用方法の詳細については、Linq to XML を検索することをお勧めします。

于 2013-05-09T00:33:15.953 に答える