2011-03-01 52 views
1

我有一些代码使用XDocument解析xml文件。如何从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

我明白,当我投了stringObject,它仍然是一个string,但有没有办法让它的实际价值(不管这可能是)的Object而不是string

因为这些都是不同的,是不是?:

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

后来当我用我的options值存储为object[],我希望能够做到:

int intValue = (int) value; 

回答

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> 

然后在你的代码,你必须检查每一个字符串值,从标签转换哪种类型。

+0

谢谢,这很有道理。但是使用type =“”唯一的方法?我只想保存我的对象[]值的方式,而不是对象字符串值,但不管它们以前是什么。所以为此,我必须将这些类型存储在xml中?在做“自动”xml序列化时,我注意到使用类似的序列化程序。也许他们是这样做的? – 2011-03-01 19:41:28

+0

Xml可以作为文本文件写入磁盘,因此如果未指定type,则无法通过任何程序从磁盘读取它以知道它以前的类型。它不必是属性 - 它可以是嵌套在value元素中的另一个元素,也可以是具有其他名称的属性,但需要向读者提供一些提示。 – ajuc 2011-03-01 19:43:55

+0

@Joan - 如果你从XML读取它们,那么它们将始终是字符串。 – 2011-03-01 19:46:13

3

是那些是不同的。你需要做的:

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

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

int intValue = Convert.ToInt32(someObject);

这将任何东西转换为int,如果能够。

+0

谢谢,但我希望能够从一个方式,这将允许我使用int intValue =(int)值的方式检索xml的值;否则,我无法通过保存/加载保存相同的值,即在之前有一个int,现在是一个字符串。 – 2011-03-01 19:30:18

+0

除非'value'已经是int,否则你将不能使用'(int)值'。如果我理解正确,'Convert.ToInt32()'方法应该适用于你。 – 2011-03-01 19:34:49

+0

@Joan:如果在解析或转换后将'intValue'存储在'object []'中,它应该可以工作。 – 2011-03-01 19:38:20

2

的XElement有明确的INT投的操作符重载,所以你应该做的是

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)) 
+0

谢谢,但我拥有的值可以是任何类型,因此我将它们作为对象[]值存储在代码中。 – 2011-03-01 19:36:52

+0

@ joan-venge当你在文件中浏览时,你必须知道值是否是整数。 XML是所有的字符串,你必须有一些格式的指示,以确定你是否要使用它作为数字,然后进行相应的转换。 – jbtule 2011-03-01 20:13:41

相关问题