gpt4 book ai didi

c# - 打开空数据表时 XmlTextReader 中是否存在错误?

转载 作者:太空宇宙 更新时间:2023-11-03 16:58:02 25 4
gpt4 key购买 nike

在保存不包含任何数据的数据表时,我在使用 C# 中的 XmlSerializer 和 XmlTextReader 时遇到了一些问题。这是一个已知问题吗?是否有解决方法?当使用 XMLSerializer 保存空数据表时,将生成以下 XML:

      <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>

当重新加载包含此内容的 XML 时,XMLTextReader 静默失败,并且不会加载超出空数据表写入 XML 的点的内容。此问题似乎是由于 xs:complexType 中缺少 xs:sequence/xs:element 条目引起的。这是一个错误吗?如果是,解决方法是什么?

以下 C# 程序演示了该问题。由于上述问题,它将输出 dt3 is null:

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();

}
}

最佳答案

(编辑后)

感谢您提供示例代码。是的,我同意这是一个错误。对于变通方法...好吧,您可以默认添加一列吗?为避免交叉污染,您可以使用 ShouldSerialize*:

public bool ShouldSerializeDt1() {
return dt1 != null && dt1.Columns.Count > 0;
}
public bool ShouldSerializeDt2() {
return dt2 != null && dt2.Columns.Count > 0;
}
public bool ShouldSerializeDt3() {
return dt3 != null && dt3.Columns.Count > 0;
}

至少 dt2 被省略了,而不是 dt3。

关于c# - 打开空数据表时 XmlTextReader 中是否存在错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/689153/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com