我正在尝试从xml文件中读取数据并将其显示在文本框中,但它只显示最后一个元素/属性,在本例中为“Endurance”。这是我的xml文件
<?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();
}
}
因此,每当我点击按钮显示数据时,文本框中显示的唯一内容就是Endurance:5
答案 0 :(得分: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();
}
}
答案 1 :(得分: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;
这有点棘手,但它很好地将名称列表与最终查询分开以获取您的数据,并使代码更清晰,以便维护需要维护的部分。
答案 2 :(得分:0)
而不是
DisplayBox.Text =
你应该使用
DisplayBox.Text +=
它应该做必要的。
答案 3 :(得分:0)
目前,您正在遍历所有节点。
最后循环在最终节点处停止。这只是耐力节点。
所以你会看到结果为耐力。
您需要检查具体情况,如果满足,则需要循环。
或者
如果您想要显示文本框中的所有值,请按照 @Kostya 和 @Furqan 答案进行操作。