C# DataSet.ReadXml() 省略了一些列
C# DataSet.ReadXml() omits some columns
这是我的 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" table 仅以列 "name" 和 "id" 结束。除非我从每个元素中删除 type="boolean",否则 "is-default" 列不会出现。
我尝试在执行 ReadXml() 之前创建 DataTable 模式,但这没有任何作用,因为我假设 DataSet.ReadXml() 会在内部重新创建 tables数据集。我还在 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
.
这样的字符串方法更合适
然后直接从XElement中读取数据:
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));
这是我的 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" table 仅以列 "name" 和 "id" 结束。除非我从每个元素中删除 type="boolean",否则 "is-default" 列不会出现。
我尝试在执行 ReadXml() 之前创建 DataTable 模式,但这没有任何作用,因为我假设 DataSet.ReadXml() 会在内部重新创建 tables数据集。我还在 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
.
然后直接从XElement中读取数据:
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));