任何人都可以幫我解決這個問題嗎? 我正在使用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對象。
任何建議,將不勝感激! 感謝
當我用'set.ReadXml(root.CreateReader(),XmlReadMode.InferTypedSchema);',我也注意到,它使用的xs:和UnsignedByte的XS :小數。什麼是期望的模式? –
我希望能夠對類型進行硬編碼,以便Age總是以整數形式出現,Score總是以小數形式出現等。 如果在此處使用InterTypedSchema時,它會嘗試動態確定類型,因此如果ID屬性類似於5000,它會導致類型爲unsignedShort。這意味着每次取決於數據,XSD都會有所不同。 –