1

無制限のコレクションを含む大きなxmlファイルを使用しています。アイデアは、XmlReaderを使用してファイルを読み取り、内部xmlをオブジェクトに逆シリアル化し、さらに処理を行うことです。

XML構造は次のようなものです。

<Basket xmlns="http://AppleFarm.com/Basket">
 <AppleCount>10000</AppleCount>
 <Apples>
  <Apple><ID>1</ID><Color>Red</Color></Apple>
  <Apple><ID>2</ID><Color>Green</Color></Apple>
  ...
  <Apple><ID>10000</ID><Color>Green</Color></Apple>
 </Apples>
</Basket>

XMLTextReaderをラップするXMLReaderを使用してファイルを読み取ると、すべてがうまくいきます。ただし、個々のリンゴをオブジェクトに逆シリアル化しようとすると、InvaildOperationExceptionがスローされます。

誰もが問題を知っていますか?それを行うためのより良い方法はありますか?

これがコードフラグメントです

//Deserialize code
public object Deserialize(XmlDocument doc, Type type){
    using(XmlNodeReader reader - new XmlNodeReader(doc.DocumentElement)){
        XmlReaderSetting settings = new XmlReaderSettings();
        settings.ValidationType = ValidationType.None;
        using(XmlReader xReader = XmlReader.Create(reader, settings)){
            XmlSerializer serializer = new XmlSerializer(type);
            object obj = serializer.Deserialize(xReader);
        }
    }
}

public void GetApples(string filepath){
    XmlTextReader reader = new XmlTextReader(filepath);
    while(reader.Read()){
        while(reader.NoteType == XmlNodeType.Element &&
            reader.Name == "Apple"){
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(reader.ReadOuterXml());
            Apple a = (Apple)Deserialize(doc, typeof(Apple));

            //...
        }
    }
}
//Deserialize code end

//Apple class
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.XmlSerialization.XmlTypeAttribute(Namespace="http://AppleFarm.com/Basket")]
public partial class Apple{
    private string idField;
    private string colorField;

    public string Id{
        get{ return this.idField; }
        set{ this.idField = value; }
    }

    public string Color{
        get { return this.colorField; }
        set { this.colorField = value; }
    }
}
//Apple class end
4

1 に答える 1

1

XMLの逆シリアル化には、最初の行が必要です

<?xml version="1.0" encoding="utf-8"?>

xmlドキュメントの一部をObjectに変換する場合は、部分的なXMLの先頭にこの行を追加する必要があります。

さらに、ElementNameが「Apple」になるXmlRootAttributeでAppleクラスを装飾する必要があります

この記事では、XmlRootAtrributehttp://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlrootattribute.aspxを設定する方法について説明します

これがお役に立てば幸いです

Reagards。

于 2010-11-09T07:51:48.450 に答える