0

XMLText Reader を使用して読み取る必要がある Web サイトでホストされている XML ファイルがあります。読んでいるときに、XML ドキュメントから項目を読み込んでクラスのリストに追加する必要があります。どのパラメーターを通過する必要があるのか​​ 、および foreach セクションがわかりません。

transList は私の List で、Transaction は私のクラスです。それらは、XML シリアライザーが既に作成した XML ファイルに書き込むために将来使用するために、上部でグローバルに定義されています。

複数のトランザクションを含む XML ファイル

<portfolio>
<transaction>
<ticker>GOOG</ticker>
<action>buy</action>
<date>20071116</date>
<shares>44</shares>
</transaction>


public class Transaction
{
    public string ticker { get; set; }
    public string action { get; set; }
    public string date { get; set; }
    public int numShares { get; set; }
    public double price { get; set; }
}

List<Transaction> transList = new List<Transaction>();


void readPortfolio(string filename)
    {
        XmlTextReader reader = new XmlTextReader(filename);
        reader.WhitespaceHandling = WhitespaceHandling.None;

        foreach(var transaction in reader) //for each reader node equal to “transaction” do:
         {
                TransList.add(Transaction tr = new Transaction(ticker, action, date, number of shares))

         }
4

3 に答える 3

1

これを試して:

public class Transaction
{
    public string Ticker { get; set; }
    public string Action { get; set; }
    public string Date { get; set; }
    public int NumShares { get; set; }
    public double Price { get; set; }
}

void ReadPortfolio(string filename)
{
    if (File.Exists(filename))
    {
        var transList = new List<Transaction>();

        foreach (XElement transaction in XDocument.Load(filename).Descendants("transaction"))
        {
            XElement ticker = transaction.Element("ticker");
            XElement action = transaction.Element("action");
            XElement date = transaction.Element("date");
            XElement shares = transaction.Element("shares");
            XElement price = transaction.Element("price");

            transList.Add(new Transaction
                {
                    Ticker = ticker != null ? ticker.Value : string.Empty,
                    Action = action != null ? action.Value : string.Empty,
                    Date = date != null ? date.Value : string.Empty,
                    NumShares = shares != null ? int.Parse(shares.Value) : default(int),
                    Price = price != null ? double.Parse(price.Value) : default(double)
                });
        }
    }
}

このメソッドは、要素が欠落している可能性がある場合を処理します。慣例に準拠するようにコードを少し書き直しました。また、ファイルの存在もチェックします。

これは金融アプリケーションのように見えるのでdecimaldouble. decimalの浮動小数点精度の問題により、お金を処理する適切な方法と見なされますdouble

于 2013-02-18T18:36:30.183 に答える
0

XDocument でそれを行う方法は次のとおりです... ファイル名のある行のコメントを外し (そして、定数を解析する行をコメントにします!)、ファイル名を渡します。

class Program
{
    static void Main(string[] args)
    {
        var test = new AnotherXmlTest();
        test.readPortfolio("filename");

        //Put a break on this line and instect object 'test'
        Console.ReadLine();
    }
}

public class AnotherXmlTest
{
    public const string xml = @"<portfolio><transaction><ticker>GOOG</ticker><action>buy</action><date>20071116</date><shares>44</shares></transaction></portfolio>";


    public class Transaction
    {
        public string ticker { get; set; }
        public string action { get; set; }
        public string date { get; set; }
        public int numShares { get; set; }
        public double price { get; set; }
    }

    List<Transaction> transList = new List<Transaction>();


    public void readPortfolio(string filename)
    {
        //Use this instead!
        //XmlTextReader reader = new XmlTextReader(filename);
        //XDocument xDoc = XDocument.Load(reader);
        XDocument xDoc = XDocument.Parse(xml);

        transList.AddRange(from transaction in xDoc.Descendants("transaction")
                           select new Transaction
                           {
                               ticker = transaction.Element("ticker").Value,
                               action = transaction.Element("action").Value,
                               date = transaction.Element("date").Value,
                               numShares = Convert.ToInt32(transaction.Element("shares").Value)
                               // No price?? 
                           });


    }
}
于 2013-02-18T18:24:50.273 に答える
0

気の利いたものにしたい場合は、私が提供した他の方法に代わる方法として、 LINQ を使用します。

public class Transaction
{
    public string Ticker { get; set; }
    public string Action { get; set; }
    public string Date { get; set; }
    public int NumShares { get; set; }
    public double Price { get; set; }
}

void ReadPortfolio(string filename)
{
    if (File.Exists(filename))
    {
        var transList = new List<Transaction>();
        transList.AddRange(from transaction in XDocument.Load(filename).Descendants("transaction")
                           let ticker = transaction.Element("ticker")
                           let action = transaction.Element("action")
                           let date = transaction.Element("date")
                           let shares = transaction.Element("shares")
                           let price = transaction.Element("price")
                           select new Transaction
                               {
                                   Ticker = ticker != null ? ticker.Value : string.Empty,
                                   Action = action != null ? action.Value : string.Empty,
                                   Date = date != null ? date.Value : string.Empty,
                                   NumShares = shares != null ? int.Parse(shares.Value) : default(int),
                                   Price = price != null ? double.Parse(price.Value) : default(double)
                               });
    }
}
于 2013-02-18T18:45:02.947 に答える