数据集.GetXmlSchema总是导致xsd属性具有type='xs:string'
本文关键字:type string xs GetXmlSchema 属性 xsd 数据集 | 更新日期: 2023-09-27 17:52:46
谁能帮我解决这个问题?我正在使用Linq XElement类创建一个XML文档。文档创建后,我将其放入一个数据集对象中。数据集allow对象允许我从创建的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" />
例如,我不知道如何将this的类型设置为整数。
我尝试更改以下行:
<我> set.ReadXml (root.CreateReader ());
:
<我> set.ReadXml (root.CreateReader (), XmlReadMode.InferTypedSchema);
这几乎工作,但它仍然没有产生我想要的确切类型。此外,使用会导致不一致的值(有时带有十进制类型的值,如Score将是type='xs:double',其他时候它们将是type='xs:Anonymous') 我>我>
是否有任何方法可以指定属性和节点的数据类型?请注意,现在我必须使用system . data . dataset类来保存xml,但我不一定要使用linq XElement类来构造要放入其中的xml。我怀疑这个问题可能与调用CreateReader创建的XNodeReader对象以及XElement类的简单性有关。
任何建议都将非常感谢!由于
问题是,当您生成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);
}
}