如何从Xml中检索值作为对象而不是字符串?

时间:2011-03-01 19:24:49

标签: c# .net xml casting linq-to-xml

我有一些使用XDocument解析xml文件的代码。

它正确检索值,但我保存到xml的一些值是Object类型。因此,当我从xml读取这些值时,它们会以string值出现,即使我将它们转换为对象:

XDocument doc = XDocument.Load ( file );
XElement xe = doc.Element ( "EffectFile" );

xe.Elements ( "Options" ).Any ( )
    ? xe.Elements ( "Options" ).Select (
        o => o.Elements ( "Option" ).Select (
            n => ( object ) n.Value ).First ( ) )
    : null ) )

xml中显示的值:

...
<Option>88</Option>
...

来自"88",而不是Object 88

我了解当我将string投射到Object时,它仍然是string,但有没有办法让它成为Object的{​​{1}}实际值(无论可能是什么)但不是string

因为这些不同,不是吗?:

object value = 88;
object value = (object) "88";

以及稍后当我使用options存储为object[]的值时,我希望能够这样做:

int intValue = (int) value;

4 个答案:

答案 0 :(得分:4)

XML拥有字符串 - 如果你确定你在xml中的哪些地方保留了它,你可以将它解析为正确的类型 - 就像Tony Casale写的那样。

或者,如果某些地方可以有任何对象,则必须添加指定xml读取代码的属性,以及读取后该节点应该更改的类型。

像这样:

<option>
     <name>some name</name>
     <value type="int">123</value>
</option>
<option>
     <name>some other name</name>
     <value type="string">abcdefg</value>
</option>

然后在您的代码中,您必须检查从值标记转换每个字符串的类型。

答案 1 :(得分:3)

是的,这些是不同的。你需要这样做:

int intValue = int.Parse("88");

如果你不知道源类型是什么,你也可以这样做:

int intValue = Convert.ToInt32(someObject);

如果可以的话,会将任何内容转换为int

答案 2 :(得分:2)

XElement有一个显式int cast的运算符重载,所以你可能应该这样做

XDocument doc = XDocument.Load ( file );
XElement xe = doc.Element ( "EffectFile" );

xe.Elements ( "Options" ).Any ( )
    ? xe.Elements ( "Options" ).Select (
        o => o.Elements ( "Option" ).Select (
            n => ( int) n).First ( ) )
    : null ) )

答案 3 :(得分:2)

XML是文本...它通常将节点的值作为文本返回。正如jbtule所说,您可以使用显式强制转换(请参阅http://msdn.microsoft.com/en-us/library/bb348319.aspx)了解详细信息。

您也可以考虑使用XML序列化而不是读取原始XML。