#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;
}
}