0

这是我的 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”和“id”列结束。除非我从每个元素中删除 type="boolean",否则“is-default”列不会出现。

我曾尝试在执行 ReadXml() 之前创建一个 DataTable 模式,但这并没有做任何事情,因为我假设 DataSet.ReadXml() 会重新创建数据集中的表。我还尝试了 ReadXml() 上的各种第二个参数来读取或推断架构,它没有任何区别(或引发错误)。

该 XML 是从我希望访问并对其进行自定义编程的 Web API 返回的内容,因此我无法控制 XML 的本机结构。如果“is-default”字段不作为布尔类型引入,我很好,因为我可以处理所有字符串类型的数据。我也可以为从 XML 加载的任何数据创建完整的模式,但我不知道在这种情况下我会在哪里或如何做到这一点。

4

2 回答 2

1

如果你真的不需要这个属性,可以按如下方式去掉:

XElement xml = XElement.Parse(lcXMLSegment);
// or load from file:  .Load("file.xml");

xml.Elements("notebook")
    .Elements("is-default")
    .Attributes("type")
    .Remove();

使用像 LinqToXml 这样的类来处理 XML 比使用像Replace.

然后直接从 XElement 中读取数据:

DataSet ds = new DataSet();

using (var reader = xml.CreateReader())
    ds.ReadXml(reader);
于 2015-08-26T22:28:14.873 回答
0

解决这个问题的另一种方法是提前准备好数据表;

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));
于 2017-09-18T10:18:47.717 回答