【问题标题】:DataSet.GetXmlSchema always results in xsd attributes have type='xs:string'DataSet.GetXmlSchema 总是导致 xsd 属性有 type='xs:string'
【发布时间】:2013-01-14 12:21:36
【问题描述】:

谁能帮我解决这个问题? 我正在使用 Linq XElement 类创建一个 XML 文档。 创建文档后,我将其放入数据集对象中。数据集允许对象允许我从创建的 XML 推断 XSD 模式,这很方便。 但是... XSD 中的数据类型都以字符串类型出现,即使对于数值也是如此。

下面是一些重现问题的示例代码:

class Person
{
    public int ID { get; set; }
    public String Name { get; set; }
    public int Age { get; set; }
    public double Score { get; set; }

    public XElement GetXML()
    {
        var person = new XElement("Person", new XAttribute("ID", ID));
        person.Add(new XElement("Name", Name));
        person.Add(new XElement("Age", Age));
        person.Add(new XElement("Score", Score));
        return person;
    }
}

static void Main(string[] args)
{
    var set = new DataSet("Test");
    var root = new XElement("root");

    var p1 = new Person() { ID = 1, Name = "P1", Age = 32, Score = 50.4 };
    var p2 = new Person() {ID = 2, Name = "P2", Age = 40, Score = 0 };

    root.Add(p1.GetXML());
    root.Add(p2.GetXML());

    set.ReadXml(root.CreateReader());
    var xml = set.GetXml();
    var schema = set.GetXmlSchema();

    Console.WriteLine(schema);
    Console.WriteLine(xml);
    Console.ReadKey(true);
}

当您运行代码时,架构将包含如下项目:

<xs:element name="Age" type="xs:string" minOccurs="0" msdata:Ordinal="1" />

例如,我看不到如何将其类型设置为整数。

我尝试更改以下行:
set.ReadXml(root.CreateReader());
到:
set.ReadXml(root.CreateReader(), XmlReadMode.InferTypedSchema);
这几乎奏效了,但它仍然没有产生我想要的确切类型。此外,使用会导致值不一致(有时具有十进制类型的值,例如 Score 会是 type='xs:double',其他时候会是 type='xs:Anonymous'

有什么方法可以指定属性和节点的数据类型? 请注意,我处于必须使用 Syste.Data.DataSet 类最终保存 xml 的位置,但我不一定必须使用 linq XElement 类来构造要放置在其中的 XML。我怀疑这个问题可能与调用 CreateReader 创建的 XNodeReader 对象有关,以及 XElement 类的简单性。

任何建议将不胜感激! 谢谢

【问题讨论】:

  • 当我使用set.ReadXml(root.CreateReader(), XmlReadMode.InferTypedSchema); 时,我注意到它使用了xs:unsignedByte 和xs:decimal。所需的架构是什么?
  • 我希望能够对类型进行硬编码,以便 Age 总是以整数形式出现,Score 总是以小数形式出现,等等。如果在这里使用 InterTypedSchema,它会尝试动态确定类型,因此如果 ID 属性类似于 5000,则会导致类型为 unsignedShort。这意味着 XSD 每次都会根据数据而有所不同。

标签: c# xml xsd linq-to-xml


【解决方案1】:

问题在于,当您生成 XML 时,您会丢失所有类型信息 - XML 仅包含字符串。你应该直接通过DataTable 去——像这样:

class Person
{
    public int ID { get; set; }
    public String Name { get; set; }
    public int Age { get; set; }
    public double Score { get; set; }

    public DataTable GetDataTable()
    {
      DataTable result = new DataTable();
      result.Columns.Add("ID", ID.GetType());
      result.Columns.Add("Name", Name.GetType());
      result.Columns.Add("Age", Age.GetType());
      result.Columns.Add("Score", ID.GetType());
      return result;
    } 
}

class Program {
  static void Main(string[] args)
  {
    var set = new DataSet("Test");

    var p1 = new Person() { ID = 1, Name = "P1", Age = 32, Score = 50.4 };
    set.Tables.Add(p1.GetDataTable());
    var schema = set.GetXmlSchema();

    Console.WriteLine(schema);

  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多