2011-03-01 50 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

相關問題