2009-07-23 12 views
2

私はC#を初めて使用しています。私は要素のリストをXMLファイルに保存するアプリケーションを構築しています。次のように私のXMLファイルの構造は次のとおりです。C#newbie:繰り返しXMLをメモリに読み込む

<Elements> 
    <Element> 
     <Name>Value</Name> 
     <Type>Value</Type> 
     <Color>Value</Color> 
    </Element> 
    <Element> 
     <Name>Value</Name> 
     <Type>Value</Type> 
     <Color>Value</Color> 
    </Element> 
    <Element> 
     <Name>Value</Name> 
     <Type>Value</Type> 
     <Color>Value</Color> 
    </Element> 
</Elements> 

私はそれらの項目の< 100を持っており、それは(私は、やり過ぎであることをも、SQLiteのDBソリューションを検討している)単一のリストです。アプリケーションが読み込まれると、この要素のリストをメモリに読み込みます。現在、Webを少し閲覧した後、XmlTextReaderを使用しています。

しかし私は間違った方法でデータを使用していますが、タグごとにデータを読み取るため、タグが特定の順序であることが必要です(そうでなければコードが乱雑になります)。私がしたいのは、完全な "Element"構造体を読み込み、名前からタグを抽出することです。私はそれが可能だと確信していますが、どのように?

明確にするために、主な違いは、今日のXmlTextReaderの使用方法で、タグの順序が間違っているなどのシナリオには寛容ではないということです。

このような構造をC#のメモリにロードするにはどうすればよいですか?

+0

ここであなたはインターネットはXmlTextReaderを見つけるために?そして、なぜMSDNで始まらなかったのですか? http://msdn.microsoft.com/en-us/xml/default.aspx、http://msdn.microsoft.com/en-us/library/system.xml.aspxを参照してください。 –

答えて

5

XmlDocumentを使用しない特別な理由はありますか?

XmlDocument myDoc = new XmlDocument() 
myDoc.Load(fileName); 

foreach(XmlElement elem in myDoc.SelectNodes("Elements/Element")) 
{ 
    XmlNode nodeName = elem.SelectSingleNode("Name/text()"); 
    XmlNode nodeType = elem.SelectSingleNode("Type/text()"); 
    XmlNode nodeColor = elem.SelectSingleNode("Color/text()"); 

    string name = nodeName!=null ? nodeName.Value : String.Empty; 
    string type = nodeType!=null ? nodeType.Value : String.Empty; 
    string color = nodeColor!=null ? nodeColor.Value : String.Empty; 

    // Here you use the values for something... 
} 
+0

おそらく私のXPathは悪いですが、@NameはName *属性を取得しません*でしょうか? –

+0

@Jon - あなたは正しい - この解決策は書かれたとおりには動作しません。 –

+0

はい、私の間違いです。 – Badaro

10

それはXMLにLINQで行うことは本当に簡単です。 .NET 3.5を使用していますか?ここではサンプルです:

using System; 
using System.Xml.Linq; 
using System.Linq; 

class Test 
{ 
    [STAThread] 
    static void Main() 
    { 
     XDocument document = XDocument.Load("test.xml"); 

     var items = document.Root 
          .Elements("Element") 
          .Select(element => new { 
           Name = (string)element.Element("Name"), 
           Type = (string)element.Element("Type"), 
           Color = (string)element.Element("Color")}) 
          .ToList(); 

     foreach (var x in items) 
     { 
      Console.WriteLine(x); 
     } 
    } 
} 

おそらく、それぞれの要素を保持するために、独自のデータ構造を作成したいが、あなたはちょうどそれを使用するために呼び出す「選択」に変更する必要があります。

+0

+1これは最も簡単な解決策です。 –

+1

LINQの皆様に感謝します。私はそれが私の単純な要求のために過度のものだと思います。私が必要とするのは、一度情報をメモリにロードすることです。 –

+0

@Rax:確かに、LINQ to XMLは、IMOを行う最も簡単な方法です。それについて過度のことは何ですか? –

1

XDocumentのように聞こえ、XElementがこのタスクに適しているかもしれません。彼らはXmlTextReaderの絶対速度を持っていないかもしれませんが、あなたのケースでは、彼らは適切であると思っており、固定構造体を扱いやすくします。そのようにうまくいく要素を解析する:

XDocument xml; 

foreach (XElement el in xml.Element("Elements").Elements("Element")) { 
    var name = el.Element("Name").Value; 
    // etc. 
} 

あなたも、LINQのと少し手の込んだ得ることができます。

XDocument xml; 

var collection = from el in xml.Element("Elements").Elements("Element") 
       select new { Name = el.Element("Name").Value, 
           Color = el.Element("Color").Value, 
           Type = el.Element("Type").Value 
          }; 


foreach (var item in collection) { 
    // here you can use item.Color, item.Name, etc.. 
} 
1

あなたがチェックする必要がありXmlSerializerクラス(http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx

public class Element 
{ 
    public string Name { get; set; } 
    public string Type { get; set; } 
    public string Color { get; set; } 
} 

class Program 
{ 

    static void Main(string[] args) 
    { 
     string xml = 
      @"<Elements> 
<Element> 
    <Name>Value</Name> 
    <Type>Value</Type> 
    <Color>Value</Color> 
</Element>(...)</Elements>"; 

XmlSerializer serializer = new XmlSerializer(typeof(Element[]), new XmlRootAttribute("Elements")); 
     Element[] result = (Element[])serializer.Deserialize(new StringReader(xml));} 
+0

ええ、でも、彼はうまくいきません。少しの未来はそれに残った。 –

関連する問題