0

xml形式で保存されたエントリの多く(多くのファイル、200GBを超えるデータ)を抽出するために、C#でXMLパーサーを作成しています。私はLinqtoXMLを使用してファイルを解析し、それらのために作成したオブジェクトにすべての情報を取得しています(14個のオブジェクト。一部のオブジェクトにはオブジェクトのリストを含むオブジェクトのリストが含まれています-大量のデータです)。

私が遭遇している問題は、一部のエントリに特定のオブジェクトのインスタンスが0個以上ある可能性があることです。データベースのコンテキストでは、これは問題ありませんが、タグの下に適切なオブジェクトが見つからない場合は、代わりに空/デフォルトのオブジェクトを作成する必要があることをプログラムに伝える方法がわかりません。プログラムを実行すると、「シーケンスに要素が含まれていません」というエラーが表示され、プログラムは空のリストを無視するのではなく、クエリを終了するだけなので、例外処理は機能しません。

linq-to-xmlクエリで0個以上のケースを処理するにはどうすればよいですか?

問題のオブジェクトの定義は次のとおりです。

<!ELEMENT prior-registration-applications (other-related-in* , prior-registration-application*)>
<!ELEMENT other-related-in (#PCDATA)>
<!ELEMENT prior-registration-application (relationship-type? , number?)>

私が問題を抱えているコードはこれです:

priorRegistrationApplications = (
                        from q in e.Elements("prior-registration-applications")
                        select new PriorRegistrationApplications(
                            (string)q.Element("other-related-in"),
                            (from w in q.Elements("prior-registration-application")
                            select new PriorRegistrationApplication(
                            (string)w.Element("relationship-type"),
                            convertToInt((string)w.Element("number")))
                        ).ToList()
                        )
                        ).First(), //end prior-applications

PriorRegistrationApplicationsのオブジェクト定義は次のとおりです。

class PriorRegistrationApplications
{
    public string other_related_in; //only one appears, regardless of number of applications it seems.
    List<PriorRegistrationApplication> priorRegistrationApplications;


public PriorRegistrationApplications(string other_related_in, List<PriorRegistrationApplication> priorRegistrationApplications)
    {
        this.other_related_in = other_related_in;
        this.priorRegistrationApplications = priorRegistrationApplications;
    }

およびPriorRegistrationApplicationの場合:

class PriorRegistrationApplication
{
    public PriorRegistrationApplication() {
        relationship_type = "";
        number = 0;
    }

    public PriorRegistrationApplication(string relationship_type, int number)
    {
        this.relationship_type = relationship_type;
        this.number = number;
    }
4

1 に答える 1

1

ToListコードがどこで失敗しているのか(または、呼び出しの前後に余分な括弧がある理由、または呼び出している理由)は完全には明らかではありませんが、ToList単にFirst()呼び出しをに変更することを検討できますFirstOrDefault()。それが戻った場合、null要素はありませんでした。これは「デフォルト」のものを作成することと同じではありませんが、いつでも使用できます。

foo = query.FirstOrDefault() ?? new PriorRegistrationApplication();

あなたが本当に望むなら。(本当にここに空のオブジェクトが必要ですか?)

また、これに注意してください:

convertToInt((string)w.Element("number"))

命名規則に違反するだけでなく、おそらく次のように簡単に記述されます。

(int) w.Element("number")
于 2012-08-29T13:30:36.017 に答える