如何解析 .NET 中联合和列表类型的值?

发布于 2024-12-09 06:46:47 字数 853 浏览 0 评论 0原文

我有一个 XML 架构,其中包含使用 的数据类型。下面是摘录:

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

上面的两个 元素是联合,下面的 元素是一个列表。

我的问题是,如何解析 .NET 中的 元素?

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

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

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

I have an XML Schema that includes data types that use <xs:union> and <xs:list>. Here is an extract:

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

And here is a sample XML fragment:

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

<values>1 2 3.2 5.6</values>

The two upper <value> elements are unions, and the lower <values> element is a list.

My question is, how do I parse an <xs:union> and <xs:list> elements in .NET?

How do I check which data type the value in a union element has?

How do I extract the elements in the a list element and convert them to a C# list?

Is there built-in support in System.XML for this kind of parsing, or do I need to write the parsing code myself?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

累赘 2024-12-16 06:46:47

希望有更好的答案,但

我认为你需要自己写。

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

Hoping for a better answer but,

I think you need to write it yourself.

If you want a generic parser for all possible instances of xs:list and xs:union you have a more difficult problem but for your specific schema, its fairly straight forward.

//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;
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文