2011-10-12 15 views
5

我有一個XML Schema,其中包含使用<xs:union><xs:list>的數據類型。下面是一個提取物:如何解析.NET中union和list類型的值?

<xs:simpleType name="mixeduniontype"> 
    <xs:union memberTypes="xs:boolean xs:int xs:double xs:string"/> 
</xs:simpleType> 

<xs:simpleType name="valuelist"> 
    <xs:list itemType="xs:double"/> 
</xs:simpleType> 

這裏是一個示例XML片段:

<value>42</value> 
<value>hello</value> 

<values>1 2 3.2 5.6</values> 

兩個上<value>元件是工會,和下<values>元件是一個列表。

我的問題是,我如何解析.NET中的<xs:union><xs:list>元素?

如何檢查union元素中的值有哪些數據類型?

如何提取列表元素中的元素並將它們轉換爲C#列表?

對於這種解析,還是需要自己編寫解析代碼,是否在System.XML中有內置支持?

+0

你是否考慮過使用'xsd.exe'來從模式類生成? – mbx

+0

使用XmlDocument.GetElementsByTagName – BLUEPIXY

回答

0

希望有一個更好的答案,但是,

我認爲你需要自己編寫。

如果你想爲所有可能的實例xs:listxs:union設置一個通用的解析器,你會遇到一個更困難的問題,但是對於你的特定模式,它是非常簡單的。

//assuming parent is the containing node 

//Parse your 'valuelist' 
var newList = new List<double>(); 
foreach (string s in parent.XElement("values").value.Split(" ")) //should check for nulls here 
{ 
    double value = 0.0; 
    if (double.TryParse(s, value)) 
    { 
     newList.Add(value); 
    } 
    else 
    { 
     \\throw some format exception 
    } 
} 

//Parse your 'mixeduniontype' 
Type valueType = typeof string; 
double doubleValue; 
int intValue; 
boolean booleanValue; 

var stringValue = parent.XElement("value").First(); 

if (double.TryParse(stringValue, doubleValue)) 
{ 
    valueType = typeof double; 
} 
else 
{ 
    if (int.TryParse(stringValue, intValue)) 
    { 
     valueType = typeof int; 
    } 
    else 
    { 
     if (bool.TryParse(stringValue, booleanValue)) 
      valueType = typeof boolean; 
    } 
}