21


8

2つの質問があります。

{空} 1 私はLinqからXMLへの対応策を模索していて、Linqを介してXML文書を変更することが可能かどうか疑問に思います。 私は、意味するような何かがありますか

XDocument xmlDoc = XDocument.Load( "sample.xml");

xmlDoc.Descendants( "item")のアイテムを更新します。ここで、(int)item .Attribute( "id")== id
...

{空} 2。 単純な方法で新しいXMLElementを作成および追加する方法を既に知っています。

xmlDoc.Element( "items")。(new XElement(......);を追加します。

しかし、どのように私は単一のエントリを削除することができますか?

XMLサンプルデータ:


6 Answer


16


ご回答ありがとうございます。 すべてうまくいきます。

私の質問を補完するのと同じように、以下のコードは単一のエントリを変更する方法を示しています。

文字列xml = @ ""; StringReader sr = new StringReader(xml); XDocument d = XDocument.Load(sr);

d.Decendants( "record")。ここで(x => x.Attribute( "id")。Value == "2")。Single()。SetAttributeValue( "info"、 "new sample info");


7


これはあなたが念頭に置いていることですか?

システムを使用する。 System.Linqを使用します。 System.Xml.Linqを使用します。

static void Main(string [] args){string xml = @ ""; StringReader sr = new StringReader(xml); XDocument d = XDocument.Load(sr);

//冗長な方法、多数の要素を削除する場合(//この場合は1つだけ削除します)var list = from X.Delement e in d.Descendants( "record")where e.Attribute( "id ").Value ==" 2 "eを選択してください。

//リストを配列に変換して、foreachで繰り返すコレクションを//変更しないようにします。(XElement e in list.ToArray()){e.Remove(); }

//簡潔な方法、これは単一の要素を削除している場合にのみ有効である//(そしてその要素が見つからない場合は爆発する)d.Descendants( "record")。Where(x => x.Attribute( "id")。値== "3")。Single()。Remove();

XmlWriter xw = XmlWriter.Create(Console.Out); d.WriteTo(xw); xw.Flush(); Console.ReadLine(); }


1


答えはこのスレッドにあります…​あなたはそれらを見つけるためにたくさんのソートをする必要があるので、私はあなたのためにそれらをコンパイルする仕事をしました:

  1. はい、あなたは要素を編集することができます

  2. 要素を削除するのは簡単です:element.Remove(); (それ以降はxDocumentを必ず保存してください)

このスレッドを読んでいるのであれば、おそらく要素を編集する方法を知りたいでしょう。 データがxmlに格納される方法は2つあります。

他の価値
  1. タグの属性として

  2. タグの内容(読み取り値)として

*属性*の値を編集するために、knoxは彼自身の質問に答えました:

d.Decendants( "record")。ここで(x => x.Attribute( "id")。Value == "2")。Single()。SetAttributeValue( "info"、 "new sample info");

つまり、変更するXElementを取得して、element.SetAttributeValue( "AttributeName"、 "属性の新しい値")を呼び出します。

もしあなたがタグの* valueやcontents *を編集したいのなら、Ajayはそれに答えました(あなたが彼のすべてのコードを掘り下げるなら):

persondata.Element( "City")。値= txtCity.Text;

または、言い換えれば、あなたが後にXElementを持っているならば、ただ使用してください。 .Value and assign away.

メモリ内の要素にこれらの変更を加えた後、それらの変更をディスクに保存したい場合は、XDocumentで.Save()を呼び出す必要があります。


0


システムを使用する。 System.Collections.Genericを使用します。 System.Linqを使用します。 System.Textを使用します。 System.Xml.Linqを使用します。 // System.Xmlを使用します。

名前空間XMLtoLinqApp \ {class Program \ {static void Main(string [] args)\ {

// XmlDocument doc = new XmlDocument(); // XmlElement newBook = doc.CreateElement( "BookParticipant"); //newBook.SetAttribute("Author ");

//関数構築を使用してXMLスキーマを作成するXElement xBookParticipant = new XElement( "BookParticipant"、new XElement( "FirstName"、 "Joe")、new XElement( "LastName"、 "Rattz")); Console.WriteLine(xBookParticipant.ToString());

//コードリスト6-1と同じXMLツリーを作成するが、はるかに少ないコードXElement xBookParticipants = new XElement( "BookParticipants"、new XElement( "BookParticipant"、new XAttribute( "type"、 "Author")、new XElement( ") FirstName "、" Joe ")、新しいXElement(" LastName "、" Rattz "))、新しいXElement(" BookParticipant "、新しいXAttribute(" type "、" Editor ")、新しいXElement(" FirstName "、" Ewan ") )、新しいXElement( "LastName"、 "Buckingham"))); Console.WriteLine(xBookParticipants.ToString());

//  -  XMLドキュメントの不利益//System.Xml.XmlElement xmlBookParticipant = new System.Xml.XmlElement( "BookParticipant"); XElement xeBookParticipant = new XElement( "BookParticipant");

XDocument xDocument = new XDocument(新しいXElement( "BookParticipants"、新しいXElement( "BookParticipant"、新しいXAttribute( "type"、 "Author")、新しいXElement( "FirstName"、 "Joe")、new XElement( "LastName") 、 "ラッツ")))); Console.WriteLine(xDocument.ToString());

//  - 要素に対してToStringメソッドを呼び出すと、XMLツリーが生成されます。XElement name = new XElement( "Name"、 "Joe"); Console.WriteLine(name.ToString());

//--Console.WriteLine要素に対してToStringメソッドを暗黙的に呼び出してXMLツリーを生成する

XElement name1 = new XElement( "Person"、新しいXElement( "FirstName"、 "Joe")、new XElement( "LastName"、 "Rattz")); Console.WriteLine(name1);

//  - 値のデータ型に要素をキャストすると値Console.WriteLine(name)が出力されます。 Console.WriteLine((string)name);

//  - ノード値の型にキャストすることによって取得されるさまざまなノード値の型XElement count = new XElement( "Count"、12); Console.WriteLine(数); Console.WriteLine((int)count);

XElement smoker = new XElement( "Smoker"、false); Console.WriteLine(喫煙者); Console.WriteLine((ブール値)喫煙者);

XElement pi = new XElement( "Pi"、3.1415926535); Console.WriteLine(pi); Console.WriteLine((double)pi);

DeferredQryProblem();

GenerateXMlFromLinqQry();

WithoutReaching();

祖先();

AncestorsAndSelf();

SortSample();

FindElementwithSpecificChild();

}

private static void DeferredQryProblem(){XDocument xDocument = new XDocument( "BookParticipants"、新しいXElement( "BookParticipant"、新しいXAttribute( "type"、 "Author")、new XElement( "FirstName"、 "Joe")) 、新しいXElement( "LastName"、 "Rattz"))、新しいXElement( "BookParticipant"、新しいXAttribute( "type"、 "Editor")、新しいXElement( "FirstName"、 "Ewan")、新しいXElement( "LastName") "、"バッキンガム ")))); IEnumerable elements = xDocument.Element( "BookParticipants")。Elements( "BookParticipant"); foreach(要素内のXElement要素){Console.WriteLine( "ソース要素:{0}:値= {1}"、element.Name、element.Value); foreach(要素内のXElement要素){Console.WriteLine( "{0} = {1}を削除しています..."、element.Name、element.Value); element.Remove(); Console.WriteLine(xDocument);

foreach(要素内のXElement要素){Console.WriteLine( "ソース要素:{0}:値= {1}"、element.Name、element.Value); foreach(elements.ToArray()のXElement要素){Console.WriteLine( "{0} = {1}を削除しています..."、element.Name、element.Value); element.Remove(); Console.WriteLine(xDocument); }

//  - 属性の作成とその要素への追加private static void CreatingAttribute(){XElement xBookParticipant = new XElement( "BookParticipant"、new XAttribute( "type"、 "Author")); Console.WriteLine(xBookParticipant); }

//  - 機能構築によるコメントの作成private static void CreatingComment(){XElement xBookParticipant = new XElement( "BookParticipant"、new XComment( "この人は退職しました。")); Console.WriteLine(xBookParticipant); }

//  - 機能構成による宣言の作成private static void CreateXmlDeclaration(){XDocument xDocument = new XDocument(new XDeclaration( "1.0"、 "UTF-8"、 "yes")、

新しいXElement( "BookParticipant")); Console.WriteLine(xDocument); }

プライベート静的無効GenerateXMlFromLinqQry(){BookParticipant [] bookParticipants = new [] BookParticipant {FirstName = "Joe"、LastName = "Rattz"、ParticipantType = ParticipantTypes.Author}、new BookParticipant {FirstName = "Ewan"、LastName = "バッキンガム "、ParticipantType = ParticipantTypes.Editor}}; XElement xBookParticipants =新しいXElement( "BookParticipants"、bookParticipants.Select(p =>新しいXElement( "BookParticipant"、新しいXAttribute( "type"、p.ParticipantType)、new XElement( "FirstName"、p.FirstName)、new XElement) ( "LastName"、p.LastName))));

Console.WriteLine(xBookParticipants); }

//  - 到達しないで要素を取得するstatic void void WithoutReaching(){XDocument xDocument = new XDocument(new XElement( "BookParticipants"、new XElement( "BookParticipant"、new XAttribute( "type"、 "Author))、new XElement( "FirstName"、 "Joe")、新しいXElement( "LastName"、 "Rattz"))、新しいXElement( "BookParticipant"、新しいXAttribute( "type"、 "Editor")、新しいXElement( "FirstName"、 "Ewan") ")、新しいXElement(" LastName "、"バッキンガム "))));

//  - 単純な子孫IEnumerable elements = xDocument.Descendants( "BookParticipant");

foreach(要素内のXElement要素){Console.WriteLine( "要素:{0}:値= {1}"、element.Name、element.Value); }

//  -  Where句を持つ子要素IEnumerable elements1 = xDocument.Descendants( "BookParticipant").Where(e =>((string)e.Element( "FirstName"))== "Ewan"); foreach(elements1のXElement element1){Console.WriteLine( "要素:{0}:値= {1}"、element1.Name、element1.Value); }

}

//  - 祖先プロトタイププライベートstatic void Ancestors(){XDocument xDocument = new XDocument(new XElement( "BookParticipants"、new XElement( "BookParticipant"、new XAttribute( "type"、 "Author"))、new XElement( "FirstName "、" Joe ")、新しいXElement(" LastName "、" Rattz "))、新しいXElement(" BookParticipant "、新しいXAttribute(" type "、" Editor ")、新しいXElement(" FirstName "、" Ewan ") 、新しいXElement( "LastName"、 "Buckingham"))));

IEnumerable elements = xDocument.Element( "BookParticipants")。子孫( "FirstName"); //まず、ソース要素を表示します。 foreach(要素内のXElement要素){Console.WriteLine( "ソース要素:{0}:値= {1}"、element.Name、element.Value); //ここで、各ソース要素の先祖要素を表示します。 foreach(elements.Ancestors()内のXElement要素){Console.WriteLine( "Ancestor要素:{0}"、element.Name); }

//それでは、各ソース要素の先祖要素を表示します。 foreach(elements.Ancestors( "BookParticipant")内のXElement要素){Console.WriteLine( "Ancestor要素:{0}"、element.Name); }

}

//  -  AncestorsAndSelfプライベートstatic void AncestorsAndSelf(){XDocument = new XDocument(新しいXElement( "BookParticipants"、新しいXElement( "BookParticipant"、new XAttribute( "type"、 "Author))、new XElement(" FirstName ") 、 "Joe")、新しいXElement( "LastName"、 "Rattz"))、新しいXElement( "BookParticipant"、新しいXAttribute( "type"、 "Editor")、新しいXElement( "FirstName"、 "Ewan")、新しいXElement( "LastName"、 "バッキンガム")))); IEnumerable elements = xDocument.Element( "BookParticipants")。子孫( "FirstName"); //まず、ソース要素を表示します。 foreach(要素内のXElement要素){Console.WriteLine( "ソース要素:{0}:値= {1}"、element.Name、element.Value); //ここで、各ソース要素の先祖要素を表示します。 foreach(elements.AncestorsAndSelf()内のXElement要素){Console.WriteLine( "Ancestor要素:{0}"、element.Name); }

//それでは、各ソース要素の先祖要素を表示します。 foreach(elements.AncestorsAndSelf( "BookParticipant")内のXElement要素){Console.WriteLine( "Ancestor要素:{0}"、element.Name); }

}

//  -  Smapleの並べ替え

private static void SortSample(){XElement root = XElement.Load( "Data.xml"); IEnumerable price = root内のelから。Elements( "Data")price =(decimal)el.Element( "Price")orderby価格選択価格; foreach(10進数でel)Console.WriteLine(el); }

//  - 特定の子を持つ要素を検索しますprivate static void FindElementwithSpecificChild(){XElement root = XElement.Load( "data.xml"); IEnumerable tests = rootのelから。Elements( "Data")ここで、(int)el.Element( "Quantity")> 3 elを選択します。 foreach(テストのXElement el)Console.WriteLine((string)el.Attribute( "TestId");}}

}

7.25 - > A 3 24.50 B 1 89.99 A 5 4.95 A 3 66.00 B 10 .99 A 15 29.00 B 8 6.99


-1


static void Main(string [] args){

// XmlDocument doc = new XmlDocument(); // XmlElement newBook = doc.CreateElement( "BookParticipant"); //newBook.SetAttribute("Author ");

//関数構築を使用してXMLスキーマを作成するXElement xBookParticipant = new XElement( "BookParticipant"、new XElement( "FirstName"、 "Joe")、new XElement( "LastName"、 "Rattz")); Console.WriteLine(xBookParticipant.ToString());

//コードリスト6-1と同じXMLツリーを作成するが、はるかに少ないコードXElement xBookParticipants = new XElement( "BookParticipants"、new XElement( "BookParticipant"、new XAttribute( "type"、 "Author")、new XElement( ") FirstName "、" Joe ")、新しいXElement(" LastName "、" Rattz "))、新しいXElement(" BookParticipant "、新しいXAttribute(" type "、" Editor ")、新しいXElement(" FirstName "、" Ewan ") )、新しいXElement( "LastName"、 "Buckingham"))); Console.WriteLine(xBookParticipants.ToString());

//  -  XMLドキュメントの不利益//System.Xml.XmlElement xmlBookParticipant = new System.Xml.XmlElement( "BookParticipant"); XElement xeBookParticipant = new XElement( "BookParticipant");

XDocument xDocument = new XDocument(新しいXElement( "BookParticipants"、新しいXElement( "BookParticipant"、新しいXAttribute( "type"、 "Author")、新しいXElement( "FirstName"、 "Joe")、new XElement( "LastName") 、 "ラッツ")))); Console.WriteLine(xDocument.ToString());

//  - 要素に対してToStringメソッドを呼び出すと、XMLツリーが生成されます。XElement name = new XElement( "Name"、 "Joe"); Console.WriteLine(name.ToString());

//--Console.WriteLine要素に対してToStringメソッドを暗黙的に呼び出してXMLツリーを生成する

XElement name1 = new XElement( "Person"、新しいXElement( "FirstName"、 "Joe")、new XElement( "LastName"、 "Rattz")); Console.WriteLine(name1);

//  - 値のデータ型に要素をキャストすると値Console.WriteLine(name)が出力されます。 Console.WriteLine((string)name);

//  - ノード値の型にキャストすることによって取得されるさまざまなノード値の型XElement count = new XElement( "Count"、12); Console.WriteLine(数); Console.WriteLine((int)count);

XElement smoker = new XElement( "Smoker"、false); Console.WriteLine(喫煙者); Console.WriteLine((ブール値)喫煙者);

XElement pi = new XElement( "Pi"、3.1415926535); Console.WriteLine(pi); Console.WriteLine((double)pi);

DeferredQryProblem();

GenerateXMlFromLinqQry();


}

private static void DeferredQryProblem(){XDocument xDocument = new XDocument( "BookParticipants"、新しいXElement( "BookParticipant"、新しいXAttribute( "type"、 "Author")、new XElement( "FirstName"、 "Joe")) 、新しいXElement( "LastName"、 "Rattz"))、新しいXElement( "BookParticipant"、新しいXAttribute( "type"、 "Editor")、新しいXElement( "FirstName"、 "Ewan")、新しいXElement( "LastName") "、"バッキンガム ")))); IEnumerable elements = xDocument.Element( "BookParticipants")。Elements( "BookParticipant"); foreach(要素内のXElement要素){Console.WriteLine( "ソース要素:{0}:値= {1}"、element.Name、element.Value); foreach(要素内のXElement要素){Console.WriteLine( "{0} = {1}を削除しています..."、element.Name、element.Value); element.Remove(); Console.WriteLine(xDocument);

foreach(要素内のXElement要素){Console.WriteLine( "ソース要素:{0}:値= {1}"、element.Name、element.Value); foreach(elements.ToArray()のXElement要素){Console.WriteLine( "{0} = {1}を削除しています..."、element.Name、element.Value); element.Remove(); Console.WriteLine(xDocument); }

//  - 属性の作成とその要素への追加private static void CreatingAttribute(){XElement xBookParticipant = new XElement( "BookParticipant"、new XAttribute( "type"、 "Author")); Console.WriteLine(xBookParticipant); }

//  - 機能構築によるコメントの作成private static void CreatingComment(){XElement xBookParticipant = new XElement( "BookParticipant"、new XComment( "この人は退職しました。")); Console.WriteLine(xBookParticipant); }

// XDocument xDocument = new XDocument( "new XDeclaration(" 1.0 "、" UTF-8 "、" yes ")、new XElement(" BookParticipant ")); //  - 機能構成による宣言の作成Console.WriteLine(xDocument); }

プライベート静的無効GenerateXMlFromLinqQry(){BookParticipant [] bookParticipants = new [] BookParticipant {FirstName = "Joe"、LastName = "Rattz"、ParticipantType = ParticipantTypes.Author}、new BookParticipant {FirstName = "Ewan"、LastName = "バッキンガム "、ParticipantType = ParticipantTypes.Editor}}; XElement xBookParticipants =新しいXElement( "BookParticipants"、bookParticipants.Select(p =>新しいXElement( "BookParticipant"、新しいXAttribute( "type"、p.ParticipantType)、new XElement( "FirstName"、p.FirstName)、new XElement) ( "LastName"、p.LastName))));

Console.WriteLine(xBookParticipants); }

//  - 到達しないで要素を取得するstatic void void WithoutReaching(){XDocument xDocument = new XDocument(new XElement( "BookParticipants"、new XElement( "BookParticipant"、new XAttribute( "type"、 "Author))、new XElement( "FirstName"、 "Joe")、新しいXElement( "LastName"、 "Rattz"))、新しいXElement( "BookParticipant"、新しいXAttribute( "type"、 "Editor")、新しいXElement( "FirstName"、 "Ewan") ")、新しいXElement(" LastName "、"バッキンガム ")))); IEnumerable elements = xDocument.Descendants( "BookParticipant"); foreach(要素内のXElement要素){Console.WriteLine( "要素:{0}:値= {1}"、element.Name、element.Value); }

IEnumerable elements1 = xDocument.Descendants( "BookParticipant").Where(e =>((string)e.Element( "FirstName"))== "Ewan"); foreach(elements1のXElement element1){Console.WriteLine( "要素:{0}:値= {1}"、element1.Name、element1.Value); }

}


-2


システムを使用する。 System.Collections.Genericを使用します。 System.Linqを使用します。 System.Webを使用する。 System.Web.UIを使用します。 System.Web.UI.WebControlsを使用します。 System.Xml.Linqを使用します。

名前空間LinqToXmlTest {public partial class _Default:System.Web.UI.Page {protected void Page_Load(object sender、EventArgs e){

protected void ReadXml(){XDocument xdocument = XDocument.Load(Server.MapPath( "People.xml"));} var people = xdocument.Descendants( "Person")の人からfrom new new {Name = person.Element( "Name")。Value、City = person.Element( "City")。Value、Age = person.Element( "年齢 ")。値}; litResults.Text = ""; foreach(var person in person){litResults.Text = litResults.Text "名前:" person.Name ""; litResults.Text = litResults.Text "市区町村:" person.City ""; litResults.Text = litResults.Text "年齢:" person.Age "

";} if(litResults.Text ==" ")litResults.Text ="結果なし... ";}

protected void butAdd_Click(object sender、EventArgs e){try {if(txtName.Text == "" || txtCity.Text == "" || txtAge.Text == ""){lblStatus.ForeColor = System.Drawing。赤色; lblStatus.Text = "フォームに記入してください"; } else {XDocument xdocumnet = XDocument.Load(Server.MapPath( "People.xml")); xdocumnet.Element( "Persons")。(new XElement( "Person"、new XElement( "Name"、txtName.Text))、new XElement( "City"、txtCity.Text)、new XElement( "Age"、txtAge)を追加します。 。テキスト))); xdocumnet.Save(Server.MapPath( "People.xml")); lblStatus.ForeColor = System.Drawing.Color.Green; "; lblStatus.Text ="データがxmlファイルに正常にロードされました "; txtName.Text = ""; txtCity.Text = ""; txtAge.Text = ""; ReadXml(); catch {lblStatus.ForeColor = System.Drawing.Color.Red;} "; lblStatus.Text ="リクエストを処理できませんでした。もう一度お試しください。 "; }

}

protected void butRead_Click(オブジェクトセンダ、EventArgs e){ReadXml(); lblStatus.Text = ""; }

protected void btnUpdate_Click(object sender、EventArgs e){try {if(txtName.Text == "" || txtCity.Text == "" || txtAge.Text == ""){lblStatus.ForeColor = System.Drawing。赤色; "; lblStatus.Text ="すべての詳細をフォームに入力してください "; } else {XDocument xdocument = XDocument.Load(Server.MapPath( "People.xml")); var persondata =(xdocument.Descendants( "Person")のpersonから。person.Element( "Name")。Value.Equals(txtName.Text)personを選択します).Single();

persondata.Element( "City")。値= txtCity.Text; persondata.Element( "Age")。値= txtAge.Text;

xdocument.Save(Server.MapPath( "People.xml")); lblStatus.ForeColor = System.Drawing.Color.Green; "; lblStatus.Text ="データは正常に更新されました "; ReadXml(); catch(Exception ex){lblStatus.ForeColor = System.Drawing.Color.Red;}} lblStatus.Text = ex.Message; }}

protected void btnDelete_Click(object sender、EventArgs e){try {if(txtName.Text == ""){lblStatus.ForeColor = System.Drawing.Color.Red; "; lblStatus.Text ="削除する人の名前を入力してください... "; } else {XDocument xdocument = XDocument.Load(Server.MapPath( "People.xml")); var persondata =(xdocument.Descendants( "Person")のpersonから。person.Element( "Name")。Value.Equals(txtName.Text)personを選択します).Single();

persondata.Remove(); xdocument.Save(Server.MapPath( "People.xml")); lblStatus.ForeColor = System.Drawing.Color.Green; "; lblStatus.Text ="データは正常に削除されました... "; txtName.Text = ""; txtCity.Text = ""; txtAge.Text = ""; ReadXml(); catch(Exception ex){lblStatus.ForeColor = System.Drawing.Color.Red;}} lblStatus.Text = ex.Message; }}}}