誰でもこの問題で私を助けることができますか? 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" />
たとえば、これの型を整数に設定する方法がわかりません。
次の行を変更してみました:
set.ReadXml(root.CreateReader());
に:
set.ReadXml(root.CreateReader(), XmlReadMode.InferTypedSchema);
これはほとんど機能しましたが、それでも私が望む正確な型を生成しませんでした。また、使用すると値に一貫性がなくなります (Score などの 10 進型の値が type='xs:double' になる場合もあれば、type='xs:Anonymous' になる場合もあります)。
属性とノードのデータ型を指定する方法はありますか? 私は最終的に Syste.Data.DataSet クラスを使用して xml を保持する必要がありますが、必ずしも linq XElement クラスを使用して XML を構築し、そこに配置する必要はありません。この問題は、CreateReader を呼び出して作成された XNodeReader オブジェクトと、XElement クラスの単純な性質に関連している可能性があると思われます。
任意の提案をいただければ幸いです! ありがとう