2011-10-12 7 views
5

Tengo un esquema XML que incluye tipos de datos que usan <xs:union> y <xs:list>. He aquí un extracto:¿Cómo puedo analizar los valores de los tipos de unión y lista en .NET?

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

Y aquí es un fragmento de XML de ejemplo:

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

<values>1 2 3.2 5.6</values> 

Los dos <value> elementos superiores son los sindicatos, y cuanto menor es <values> elemento de una lista.

Mi pregunta es, ¿cómo puedo analizar un <xs:union> y <xs:list> elementos en .NET?

¿Cómo verifico qué tipo de datos tiene el valor en un elemento de unión?

¿Cómo se extraen los elementos en el elemento a list y se convierten a una lista C#?

¿Hay soporte integrado en System.XML para este tipo de análisis sintáctico, o tengo que escribir el código de análisis yo mismo?

+0

¿Ha considerado usar 'xsd.exe' para la generación de clases a partir del esquema? – mbx

+0

use XmlDocument.GetElementsByTagName – BLUEPIXY

Respuesta

0

la esperanza de una mejor respuesta, pero,

Creo que se necesita para escribir por sí mismo.

Si desea un analizador genérico para todas las instancias posibles de xs:list y xs:union, tiene un problema más difícil, pero para su esquema específico, es bastante directo.

//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; 
    } 
} 
Cuestiones relacionadas