我的XML:
<notebooks>
<notebook>
<is-default type="boolean">true</is-default>
<name>James's notebook</name>
<id>MS4zfDEvMS9Ob3RlYm9va3wzLjM=</id>
</notebook>
<notebook>
<is-default type="boolean">false</is-default>
<name>James alternate notebook</name>
<id>NDQuMnwzNC8zNC9Ob3RlYm9va3wxMTIuMg==</id>
</notebook>
<notebook>
<is-default type="boolean">false</is-default>
<name>Notebook for James lab</name>
<id>NTMuM3w0MS80MS9Ob3RlYm9va3wxMzUuMw==</id>
</notebook>
</notebooks>
,我正在做我在这里发现的标准数据集加载:
DataSet ds = new DataSet();
ds.ReadXml(new StringReader(lcXMLSegment));
一切正常,除了"notebook"表最后只有"name"one_answers"id"列。除非我从每个元素中删除type="boolean",否则列"is-default"不会显示出来。
我尝试在执行ReadXml()之前创建一个DataTable模式,但这没有做任何事情,因为我假设DataSet.ReadXml()在数据集中重新创建表。我还尝试了ReadXml()上的各种第二个参数来读取或推断模式,但没有任何区别(或抛出错误)。
这个XML是从我希望访问和定制编程的web API返回的,所以我无法控制XML的本机结构。如果"is-default"字段不作为布尔类型拉入,我很好,因为我可以处理字符串类型的所有数据。我也可以为从XML加载的任何数据创建完整的模式,但我不知道在哪里或如何在这种情况下这样做。
如果你真的不需要这个属性,它可以被删除如下:
XElement xml = XElement.Parse(lcXMLSegment);
// or load from file: .Load("file.xml");
xml.Elements("notebook")
.Elements("is-default")
.Attributes("type")
.Remove();
使用类处理XML(如LinqToXml)比使用字符串方法(如Replace
)更合适。
DataSet ds = new DataSet();
using (var reader = xml.CreateReader())
ds.ReadXml(reader);
解决这个问题的另一种方法是提前准备好数据表;
DataSet ds = new DataSet();
DataTable dt = new DataTable("notebook");
dt.Columns.Add("is-default", typeof(bool));
dt.Columns.Add("name", typeof(string));
dt.Columns.Add("id", typeof(string));
ds.Tables.Add(dt);
ds.ReadXml(new StringReader(lcXMLSegment));