Как мне анализировать значения типов union и list в .NET?

#c# #.net #xml #xsd

#c# #.net #xml #xsd

Вопрос:

У меня есть XML-схема, которая включает типы данных, которые используют <xs:union> и <xs: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> элемент — список.

Мой вопрос в том, как мне анализировать <xs:union> <xs:list> элементы and в .NET?

Как мне проверить, какой тип данных имеет значение в элементе union?

Как мне извлечь элементы из элемента списка и преобразовать их в список C #?

Есть ли встроенная поддержка в System.XML для такого рода синтаксического анализа, или мне нужно самому написать код синтаксического анализа?

Комментарии:

1. Рассматривали ли вы возможность использования xsd.exe для генерации классов из схемы?

2. используйте XmlDocument. GetElementsByTagName

Ответ №1:

Надеясь на лучший ответ, но,

Я думаю, вам нужно написать это самостоятельно.

Если вам нужен универсальный анализатор для всех возможных экземпляров xs:list , и xs: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;
    }
}