2012-06-16 38 views
0

我試圖從XML文件讀取數據並將其顯示在文本框中,但它僅顯示最後一個元素/屬性,在本例中爲「耐力」。這裏是我的xml文件C#XmlTextReader未讀取所有元素和屬性

<?xml version="1.0" encoding="utf-8"?> 
<Character> 
    <Name 
    Name="Test" /> 
    <Age 
    Age="19" /> 
    <Class 
    Class="Necromancer" /> 
    <Strength 
    Strength="1" /> 
    <Dexterity 
    Dexterity="2" /> 
    <Intelligence 
    Intelligence="3" /> 
    <Speed 
    Speed="4" /> 
    <Endurance 
    Endurance="5" /> 
</Character> 

我的讀者代碼如下

XmlTextReader reader = new XmlTextReader(openFileDialog1.FileName); 
while (reader.Read()) 
{ 
    if (reader.HasAttributes) 
    { 
    for (int i = 0; i < reader.AttributeCount; i++) 
    { 
     reader.MoveToAttribute(i); 
     switch (reader.Name) 
     { 
     case "Name": 
      DisplayBox.Text = "Name: " + reader.Value + "\n"; 
      break; 
     case "Age": 
      DisplayBox.Text = "Age: " + reader.Value + "\n"; 
      break; 
     case "Class": 
      DisplayBox.Text = "Class: " + reader.Value + "\n"; 
      break; 
     case "Strength": 
      DisplayBox.Text = "Strength: " + reader.Value + "\n"; 
      break; 
     case "Dexterity": 
      DisplayBox.Text = "Dexterity: " + reader.Value + "\n"; 
      break; 
     case "Intelligence": 
      DisplayBox.Text = "Intelligence: " + reader.Value + "\n"; 
      break; 
     case "Speed": 
      DisplayBox.Text = "Speed: " + reader.Value + "\n"; 
      break; 
     case "Endurance": 
      DisplayBox.Text = "Endurance: " + reader.Value + "\n"; 
      break; 
     default: 
      break; 
     } 
    } 
     reader.MoveToElement(); 
    } 
} 

所以每當我按一下按鈕來顯示數據,在文本框中顯示出來的唯一的事情就是耐力:5

回答

1

看起來你需要

DisplayBox.Text += 

的開關條件,此外,所有更換

DisplayBox.Text = 

非常相似。因此,您可以使用以下內容:

string[] supportedAttributes = new []{"Name", "Age", "Class", "Strength", "Dexterity", "Intelligence", "Speed", "Endurance"}; 
while (reader.Read()) 
{ 
    if (reader.HasAttributes) 
    { 
    for (int i = 0; i < reader.AttributeCount; i++) 
    { 
     reader.MoveToAttribute(i); 
     if(supportedAttributes.Any(a=>a == reader.Name)) 
      DisplayBox.Text += string.Format("{0}: {1} \n", reader.Name, reader.Value); 
    } 
    reader.MoveToElement(); 
    } 
} 
+0

非常感謝你,簡直不敢相信那麼簡單! –

0

,而不是

DisplayBox.Text = 

你應該使用像

DisplayBox.Text += 

它應該做的要求。

0

當前您正在循環所有節點。

最後循環停止在最終節點。那隻不過是耐力節點。

所以你會看到Endurance的結果。

你需要檢查特定的條件,如果它滿足,那麼你需要出來的循環。

或者

如果你想顯示在文本框中的所有值然後按照@Kostya@Furqan答案。

1

我沒有直接回答你的問題,而是提供了另一種編寫代碼的方法。

switch聲明,特別是重複自己,重複可以被刪除。

還使用switch語句將您的代碼鎖定到特定值。例如,您無法動態更改要使用的屬性名稱列表 - 例如,可能用於其他語言。

這裏是我的代碼:

var xd = XDocument.Load(openFileDialog1.FileName); 

var query = 
    from xe in xd.Descendants() 
    from xa in xe.Attributes() 
    let r = map(xa.Name.ToString(), xa.Value) 
    where r != null 
    select r; 

DisplayBox.Text = String.Join("", query); 

現在唯一缺少的是對map函數的定義。這是代碼變得有點尖銳的地方。

首先下手的名字你正在尋找:

var names = new [] 
{ 
    "Name", "Age", "Class", 
    "Strength", "Dexterity", "Intelligence", 
    "Speed", "Endurance", 
}; 

現在我們只需要定義負責映射幾個變量:

var nameMap = 
    names 
     .ToDictionary(
      n => n, 
      n => (Func<string, string>) 
       (t => String.Format("{0}: {1}\n", n, t))); 

Func<string, string, string> map = 
    (n, v) => 
     nameMap.ContainsKey(n) ? nameMap[n](v) : null; 

這是一個有點棘手,但它很好地將名稱列表從最終查詢中分離出來,以獲取您的數據,並將您的代碼保持爲需要維護的部分更清晰。