2013-01-14 67 views
1

任何人都可以幫我解決這個問題嗎? 我正在使用Linq XElement類創建一個XML文檔。 創建文檔後,我將其放入數據集對象中。數據集允許對象允許我從創建的XML中推斷出XSD模式,這很方便。 但是... XSD中的數據類型都以字符串的形式出現,即使對於數字值也是如此。DataSet.GetXmlSchema總是會導致xsd屬性有type ='xs:string'

下面是再現問題的一些示例代碼:

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,以及XElement類的簡單自然產生的XNodeReader對象。

任何建議,將不勝感激! 感謝

+0

當我用'set.ReadXml(root.CreateReader(),XmlReadMode.InferTypedSchema);',我也注意到,它使用的xs:和UnsignedByte的XS :小數。什麼是期望的模式? –

+0

我希望能夠對類型進行硬編碼,以便Age總是以整數形式出現,Score總是以小數形式出現等。 如果在此處使用InterTypedSchema時,它會嘗試動態確定類型,因此如果ID屬性類似於5000,它會導致類型爲unsignedShort。這意味着每次取決於數據,XSD都會有所不同。 –

回答

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); 

    } 
} 
相關問題