1

誰でもこの問題で私を助けることができますか? 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 クラスの単純な性質に関連している可能性があると思われます。

任意の提案をいただければ幸いです! ありがとう

4

1 に答える 1

0

問題は、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);

  }
}
于 2013-01-15T14:31:31.690 に答える