j'ai écrit une implémentation simple lecteur de fichiers. Vous pouvez facilement adapter ce pour lire un fichier xml:
public class MyFileDataReader : IDataReader
{
protected StreamReader Stream { get; set; }
protected object[] Values;
protected bool Eof { get; set; }
protected string CurrentRecord { get; set; }
protected int CurrentIndex { get; set; }
public MyFileDataReader(string fileName)
{
Stream = new StreamReader(fileName);
Values = new object[this.FieldCount];
}
Rappelez-vous que IDataReader a plusieurs méthodes que vous ne avez pas besoin de mettre en œuvre en fonction de votre scénario. Mais sans doute il y a quelques implémentations de méthodes que vous ne serez pas en mesure d'éviter:
public void Close()
{
Array.Clear(Values, 0, Values.Length);
Stream.Close();
Stream.Dispose();
}
public int Depth
{
get { return 0; }
}
public DataTable GetSchemaTable()
{
// avoid to implement several methods if your scenario do not demand it
throw new NotImplementedException();
}
public bool IsClosed
{
get { return Eof; }
}
public bool NextResult()
{
return false;
}
public bool Read()
{
CurrentRecord = Stream.ReadLine();
Eof = CurrentRecord == null;
if (!Eof)
{
Fill(Values);
CurrentIndex++;
}
return !Eof;
}
private void Fill(object[] values)
{
//To simplify the implementation, lets assume here that the table have just 3
//columns: the primary key, and 2 string columns. And the file is fixed column formatted
//and have 2 columns: the first with width 12 and the second with width 40. Said that, we can do as follows
values[0] = null;
values[1] = CurrentRecord.Substring(0, 12).Trim();
values[2] = CurrentRecord.Substring(12, 40).Trim();
// by default, the first position of the array hold the value that will be
// inserted at the first column of the table, and so on
// lets assume here that the primary key is auto-generated
// if the file is xml we could parse the nodes instead of Substring operations
}
public int RecordsAffected
{
get { return -1; }
}
Pour mettre en œuvre IDataReader, est également obligatoire pour mettre en œuvre le IDisposable et les interfaces IDataRecord.
L'IDisposable est facile, mais l'IDataRecord peut être douloureux. Encore une fois, dans ce scénario, il existe certaines méthodes implémentations que nous ne sommes pas en mesure d'éviter:
public int FieldCount
{
get { return 3;//assuming the table has 3 columns }
}
public IDataReader GetData(int i)
{
if (i == 0)
return this;
return null;
}
public string GetDataTypeName(int i)
{
return "String";
}
public string GetName(int i)
{
return Values[i].ToString();
}
public string GetString(int i)
{
return Values[i].ToString();
}
public object GetValue(int i)
{
return Values[i];
}
public int GetValues(object[] values)
{
Fill(values);
Array.Copy(values, Values, this.FieldCount);
return this.FieldCount;
}
public object this[int i]
{
get { return Values[i]; }
}
Espérons que cela aide.
semble bien, utilise http://msdn.microsoft.com/en-us/library/system.xml.xmlreader.aspx aide? – kenny
Pas vraiment, mon problème principal est de charger le DataSet avec le XML: -/ –
Avez-vous l'intention de l'utiliser pour des jeux de résultats très volumineux? –