我有一些使用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;
答案 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。