0

次の形式のxmlがあります。

<?xml version="1.0" encoding="UTF-8" standalone= "yes"?>
<rss>
<report name="rpt1">
<title>AAA</title>
<image></image>
<weblink></weblink>
<pdflink></pdflink>
<pdfsize></pdfsize>
</report>
<report name="rpt2">
<title>BBB</title>
<image>CCC</image>
<weblink>DDD</weblink>
<pdflink>EEE</pdflink>
<pdfsize>FFF</pdfsize>
</report>
</rss>

今、私はこのxmlを反復してレポートノードを取得し、そこからタイトル/pdfリンク/サイズなどの子ノードを取得したいと考えています。for ループを使用したループ。これを達成するために xmltextreader を使用したいと思います。while を使用してみましたが、反復後にループが 1 つしか得られません。どうしてか分かりません。for ループの場合、 for(loop when reader.element("reports)){} のように反復し、残りのノードを取得して、それらを配列またはリストなどに入れます。それらをリストに格納したら、フィード内でそれらを表示したい. これを行うための最良の方法はどれですか? pls help.

4

1 に答える 1

0

私の場合、大きなドキュメントをロードする際のパフォーマンスが心配でした。私が行ったことは、オブジェクトにコンストラクターを定義して XmlReader を受け取り、ハイドレートすることです - 完全なノードに到達した後にリーダーを渡します。

これにより、読み込み中のオブジェクトごとに、入力されたオブジェクトを IEnumerable として返すことができます。次に、新しいタスク/スレッドを起動して、その個々のアイテムの処理を処理し、ファイルの処理に戻ります。

private IEnumerable<Report> readReports(Stream reader)
{
    var settings = new XmlReaderSettings();
    settings.IgnoreWhitespace = true;
    var xmlReader = XmlReader.Create(reader, settings);
    xmlReader.MoveToContent();
    xmlReader.Read();
    while (!xmlReader.EOF)
    {
        if (xmlReader.Name.ToUpper() == "report") 
            yield return new Report(xmlReader);

        xmlReader.Read();
    }
}

public Report(XmlReader reader) : this()
{
    reader.MoveToContent();
    if (reader.IsEmptyElement)
    {
        reader.Read();
        return;
    }

    reader.Read();
    while (!reader.EOF)
    {
        if (reader.IsStartElement())
        {
            switch (reader.Name.ToLower())
            {
                case "order_id":
                    this.OrderId = reader.ReadElementContentAsString();
                    break;
                    // abreviated the rest of the fields
                default:
                    reader.Skip();
                    break;
            }
        }
        else if (reader.Name.ToLower() == "report") //this watches for the end element of the container and returns after populating all properties
            return;
    }
}

他のコミュニティからのフィードバックをお待ちしております。より良いアプローチがある場合、またはここにエラーがある場合はお知らせください。

于 2012-08-09T18:45:46.357 に答える