2011-10-28 9 views
0

EDITの:私は、プレイヤーのクラスを持っているのXElementXmlTextReaderは、読書childelements(または親要素?)要素

へてXmlTextWriterからスイッチを次のようしていた変数:

static string Name; 
static int Level; 
static int Cash; 

そして、私は保存しましたそれらをXElementを持つ "Profiles.xml"ファイルに追加すると、次のようになります。

<John> 
    <level>3</level> 
    <cash>215</cash> 
</John> 

<Mike> 
    <level>7</level> 
    <cash>780</cash> 
</Mike> 

マイク、どのように現金とレベルを取得するのですか?

+0

まず、新しいXmlTextReader()を使用しないでください。 'XmlReader.Create()'を使用してください。第二に、 'XmlReader'はXMLを読むのが最も難しい方法です。 XMLにLINQを使用していない、または少なくとも 'XmlDocument'を使用している理由はありますか? –

+0

私はLINQを使用していない理由はありません。ちょうどそれに切り替えましたが、Googleから明確なチュートリアルは見つかりませんでした。情報を取得する方法については、私は書くことができます:/ –

+0

Googleの使用を中止することをお勧めしますベンダーが既に文書化している科目に関するチュートリアル。 [System.Xml.Linq名前空間](http://msdn.microsoft.com/en-us/library/bb299195.aspx)を参照してください。 XMLを読み込むには、['XDocument.Load'](http://msdn.microsoft.com/en-us/library/bb358684.aspx)を使用してください。 –

答えて

1

ここに行く..

コンソールアプリケーションおよびXMLにLINQを使用して作成した
XDocument doc = XDocument.Parse(@" 
<Players><John> 
<level>3</level> 
<cash>215</cash> 
</John> 
<Mike> 
<level>7</level> 
<cash>780</cash> 
</Mike> 
</Players>"); 

var players = doc.Root.Elements(); 

foreach (var player in players) 
{ 
    if (player.Name.ToString() == "Mike") 
    { 
     Console.WriteLine(player.Element("level")); 
     Console.WriteLine(player.Element("cash")); 
    } 
} 
+0

今、余分なタグが必要です。しかし、我々は進歩している、今までのところ最高の答え、なしでこれを行うことができれば、それは完璧です。 Nvm、私はそれを自分で修正し、メインのポストを編集しました。ありがとう:) –

+0

あなたのXMLファイル全体はどうやって見えますか? Playersタグを持たずにルート要素がない場合は、ルート要素なしでXElementを使用することはできません。そしてそれはよく整形されたXMLではありません。 – Gokul

+0

まだ十億の問題がある場合、複数のルート要素が存在しない場合、タグ内に新しいプレーヤーを追加するにはどうすればよいですか? –

0

xmlシリアル化を使用してください。これはすべて終了します。

public string Serialise(T someObject) 
     { 
      XmlSerializer ser = new XmlSerializer(typeof (T)); 
      MemoryStream memStream = new MemoryStream(); 
      XmlConfigTextWriter xmlWriter = new XmlConfigTextWriter(memStream, Encoding.UTF8); 
      xmlWriter.Namespaces = true; 
      XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
      ns.Add("", ""); //we don't want namespace data here.     
      ser.Serialize(xmlWriter, someObject, ns); 
      xmlWriter.Close(); 
      memStream.Close(); 
      string xml = Encoding.UTF8.GetString(memStream.GetBuffer()); 
      xml = xml.Substring(xml.IndexOf(Convert.ToChar(60))); 
      xml = xml.Substring(0, (xml.LastIndexOf(Convert.ToChar(62)) + 1)); 
      return xml; 
     } 

をしてdeserialiseする:一般的にシリアライズするには

public T Deserialise(string objectXml) 
    { 
     XmlSerializer reader = new XmlSerializer(typeof (T)); 
     StringReader stringReader = new StringReader(objectXml); 
     XmlTextReader xmlReader = new XmlTextReader(stringReader); 
     return (T) reader.Deserialize(xmlReader); 
    } 
0

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml.Linq; 

namespace ConsoleApplication8 
{ 
    public class Player 
    { 
     public string Name { get; set; } 
     public int level { get; set; } 
     public int cash { get; set; } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      // you may have several players like below 
      List<Player> Players = new List<Player>() { 
       new Player() { Name = "John", cash = 3, level = 215 }, 
       new Player() { Name = "Mike", level = 7, cash = 780 } 
      }; 

      // save them to Xml file 

      Save("players.xml", Players); 

      //when you need details of a given player "Mike" 
      Player PlayersMike = Load("players.xml", "Mike"); 

      // Adding new player 

      AddPlayer("players.xml", new Player() { Name = "Test", level = 1, cash = 780 }); 


     } 

     /// <summary> 
     /// Saves the specified XML file with players data 
     /// </summary> 
     /// <param name="xmlFile">The XML file.</param> 
     /// <param name="Players">The players.</param> 
     public static void Save(string xmlFile, List<Player> Players) 
     { 
      XElement xml = new XElement("Players", 
          from p in Players 
          select new XElement("Player", 
           new XElement("Name", p.Name), 
           new XElement("level", p.level), 
           new XElement("cash", p.cash))); 

      xml.Save(xmlFile); 

     } 

     /// <summary> 
     /// Loads the specified XML file. 
     /// </summary> 
     /// <param name="xmlFile">The XML file.</param> 
     /// <returns></returns> 
     public static Player Load(string xmlFile, string name) 
     { 
      XDocument doc = XDocument.Load(xmlFile); 

      var query = (from xElem in doc.Descendants("Player") 
         where xElem.Element("Name").Value.Equals(name) 
         select new Player 
         { 
          Name = xElem.Element("Name").Value, 
          level = int.Parse(xElem.Element("level").Value), 
          cash = int.Parse(xElem.Element("cash").Value), 
         }).FirstOrDefault(); 
      return query; 
     } 

     /// <summary> 
     /// Adds the player. 
     /// </summary> 
     /// <param name="xmlFile">The XML file.</param> 
     /// <param name="p">The p.</param> 
     public static void AddPlayer(string xmlFile, Player p) 
     { 
      XDocument doc = XDocument.Load(xmlFile); 
      doc.Element("Players").Add(
       new XElement("Player", 
           new XElement("Name", p.Name), 
           new XElement("level", p.level), 
           new XElement("cash", p.cash))); 
      doc.Save(xmlFile); 
     } 
    } 
} 
+0

これも機能しますが、既存のファイルに新しいプレーヤーを追加するにはどうすればいいですか?新しいを作成せずにはできません:/ –

+0

Pの全く新しい質問をしました。 –

関連する問題