我有一个像这样的XML文件:
<Document>
<Tests>
<Test>
<Name>A</Name>
<Value>1</Value>
</Test>
<Test>
<Name>A</Name>
<Value>2</Value>
</Test>
<Test>
<Name>B</Name>
<Value>10</Value>
</Test>
<Test>
<Name>B</Name>
<Value>20</Value>
</Test>
</Tests>
</Document>
我创建了一个类来保存每个Test
节点的数据:
public class TestData
{
public string TestName {get; set;}
public float TestValue {get; set;}
}
我使用像这样的XPATH读取数据(ztr
是XmlDocument
的实例我已经知道我将要阅读的Test
的名称,因为它被填充到了ListView的):
public TestData GetTestData(string testName)
{
TestData data = new TestData();
data.TestName = testName;
data.TestValue = float.Parse(ztr.SelectSingleNode("/Document/Tests/Test[Name = '" + testName + "')]/Value").InnerText, CultureInfo.InvariantCulture);
return data;
}
现在,问题是,如果我想将数据列表设为List<TestData>
,则每个TestData仅引用XML文件中第一次出现的Test节点。我的意思是让我想象我有一个ListView,它已经被我的xml文件中所有Test
个节点的名称填充。在这种情况下就是这样的:
ListView = A,A,B,B
然后我将所有名称复制到字符串[]数组
我使用这段代码一次性读取它们:
private List<TestData> GetAllData()
{
List<TestData> Datas = new List<TestData>();
TestData data;
foreach(string test in stringOfNames)
{
data = new TestData;
data = GetTestData(test);
Datas.add(data);
}
return Datas
}
正如我告诉你的那样这段代码没有区分不同的Test
。它只返回Test
的第一次出现,因此GetAllData()
的结果将为:
Name Value
A 1
A 1
B 10
B 10
但我希望它像
Name Value
A 1
A 2
B 10
B 20
你能告诉我我做错了什么吗?以及如何解决这个问题?
P.S。我在stackoverflow中编写了所有代码......它们没有编译,只是想象它们工作正常:D
答案 0 :(得分:1)
修改您的GetTestData()
方法(及其来电者):
public TestData GetTestData(string testName, int pos)
{
TestData data = new TestData();
data.TestName = testName;
data.TestValue
= float.Parse(
ztr.SelectSingleNode("/Document/Tests/Test[Name = '" + testName + "')][" + pos + "]/Value").InnerText, CultureInfo.InvariantCulture);
return data;
}
答案 1 :(得分:1)
而不是使用SelectSingleNode
,而是使用SelectNodes
代替,我认为您当前的xpath应该足够了。您必须重新编写GetTestData
方法来处理迭代XmlNodeList
以解析出正确的float
值。