Ich habe einige Probleme mit XmlSerializer und XmlTextReader in C# beim Speichern von DataTables, die keine Daten enthalten. Ist dies ein bekanntes Problem und gibt es eine Problemumgehung? Wenn eine leere Datentabelle gespeichert wird mit XMLSerializer folgenden XML generiert:Gibt es einen Fehler in XmlTextReader beim Öffnen leerer Databases?
<Values>
<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="Values" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="Values">
<xs:complexType>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1" />
</Values>
Wenn die XML diese enthält, wird neu geladen XMLTextReader leise ausfällt und nicht geladen Inhalt über den Punkt hinaus, an das die leere Datentabelle in die XML geschrieben wird. Dieses Problem scheint durch das Fehlen eines xs: sequence/xs: -Elementeintrags in xs: complexType verursacht zu werden. Ist das ein Fehler und wenn ja, was ist der Workaround?
Das folgende C# -Programm zeigt das Problem. Es wird Ausgabe DT3 aufgrund der Ausgabe oben beschriebenen null ist:
public class Data
{
private DataTable dt1;
private DataTable dt2;
private DataTable dt3;
public DataTable Dt1
{
get { return dt1; }
set { dt1 = value; }
}
public DataTable Dt2
{
get { return dt2; }
set { dt2 = value; }
}
public DataTable Dt3
{
get { return dt3; }
set { dt3 = value; }
}
public void TestDataTables()
{
if(dt1 == null)
Console.WriteLine("dt1 is null");
if (dt2 == null)
Console.WriteLine("dt2 is null");
if (dt3 == null)
Console.WriteLine("dt3 is null");
}
}
class Program
{
static void Main(string[] args)
{
// Create test object
Data data = new Data();
data.Dt1 = new DataTable("Test1");
data.Dt1.Columns.Add("Foo");
data.Dt2 = new DataTable("Test2");
// Adding the following line make serialization work as expected
//data.Dt2.Columns.Add("Foo");
data.Dt3 = new DataTable("Test3");
data.Dt3.Columns.Add("Foo");
data.TestDataTables();
// Save to XML
TextWriter filewriter = new StreamWriter("foo.xml");
XmlTextWriter writer = new XmlTextWriter(filewriter);
writer.Formatting = Formatting.Indented;
XmlSerializer s1 = new XmlSerializer(typeof(Data));
s1.Serialize(writer, data);
writer.Close();
filewriter.Close();
// Reload from XML
TextReader filereader = new StreamReader("foo.xml");
XmlTextReader reader = new XmlTextReader(filereader);
XmlSerializer s2 = new XmlSerializer(typeof(Data));
Data newData = s2.Deserialize(reader) as Data;
newData.TestDataTables();
}
}
Bitte poste ein kurzes, aber vollständiges Programm, das das Problem demonstriert - nur das rohe XML und den Code, der es mit XmlTextReader liest. Es ist unklar, was Sie meinen, wenn Sie über XmlTextReader sprechen und nicht "Objekte laden". –