【问题标题】:How do I parse values of union and list types in .NET?如何在 .NET 中解析联合和列表类型的值?
【发布时间】:2011-12-05 22:44:31
【问题描述】:

我有一个 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>

上面的两个&lt;value&gt;元素是联合,下面的&lt;values&gt;元素是一个列表。

我的问题是,如何在 .NET 中解析 &lt;xs:union&gt;&lt;xs:list&gt; 元素?

如何检查联合元素中的值具有哪种数据类型?

如何提取列表元素中的元素并将它们转换为 C# 列表?

System.XML 中是否有内置支持这种解析,还是需要我自己编写解析代码?

【问题讨论】:

  • 您是否考虑过使用xsd.exe 从模式生成类?
  • 使用 XmlDocument.GetElementsByTagName

标签: c# .net xml xsd


【解决方案1】:

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

我觉得你需要自己写。

如果您想要一个通用解析器来处理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;
    }
}

【讨论】:

    猜你喜欢
    • 2019-08-01
    • 2018-02-28
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 2011-03-31
    • 2019-12-14
    相关资源
    最近更新 更多