GetElementsByTagName 只获取第一个节点(XMLDocument)
GetElementsByTagName only gets the first node (XMLDocument)
这是我的代码:
FileInfo[] Files = difo.GetFiles("*.xml");
string[] parts;
string[] FileSearchRes = Directory.GetFiles(@"C:\Users\ahodhv\Perforce\ahodhv_RD0029717_1921\prod\delivery\q_rec\int_test\SOPS", "*.xml", SearchOption.AllDirectories);
int i = 0;
foreach (FileInfo File in Files)
{
parts = File.Name.Split('_');
boxvehicles.Items.Add(parts[0]);
string test = FileSearchRes[i];
doc.Load(FileSearchRes[i]);
List<string> name = new List<string>();
var accountNodes = doc.GetElementsByTagName("FpcBlock");
for (int j = 0; j < accountNodes.Count; j++)
{
var account = accountNodes[j].SelectSingleNode("./FPC");
if (account != null && account.Attributes != null)
{
// Read node attribute
name.Add(account.Attributes["Name"].Value + account.Attributes["Value"].Value);
}
}
i++;
}
我正在尝试从如下所示的 xml 文件中读取:
<FpcBlock Version="01">
<FPC Name="1" Value="A" Updated="false" />
<FPC Name="3" Value="B" Updated="false" />
<FPC Name="5" Value="B" Updated="false" />
<FPC Name="8" Value="B" Updated="false" />
<FPC Name="10" Value="B" Updated="false" />
</FpcBlock>
问题出在以下行:
var accountNodes = doc.GetElementsByTagName("FpcBlock");
accountnodes 的计数为 1,这是不正确的,因为我有更多节点。因此,只有第一个节点被添加到名称中。我做错了什么?
编辑:对不起,如果我感到困惑。我想将下面的所有行保存在列表中。我想要的是列表应该是这样的:
1A
3B
5B
等等。所以我保存名称和值。但目前我只得到第一行 1A.
编辑 2:
我误解了 GetElementsByTagName()
方法。通过更改为 GetElementsByTagName("FPC")
它应该是问题。
您正在查询名为 FpcBlock
的元素,但似乎需要名为 FPC
的元素。如果您更改为查找您实际要查找的元素,那么您可能会发现问题消失了。
也就是说,LINQ to XML 比旧的 XmlDocument
API 更现代、更干净 API。使用这个会更好:
var nameValues =
from fpc in doc.Descendants("FPC")
select new
{
Name = (int) fpc.Attribute("Name"),
Value = (string) fpc.Attribute("Value")
};
有关工作演示,请参阅 this fiddle。
这是我的代码:
FileInfo[] Files = difo.GetFiles("*.xml");
string[] parts;
string[] FileSearchRes = Directory.GetFiles(@"C:\Users\ahodhv\Perforce\ahodhv_RD0029717_1921\prod\delivery\q_rec\int_test\SOPS", "*.xml", SearchOption.AllDirectories);
int i = 0;
foreach (FileInfo File in Files)
{
parts = File.Name.Split('_');
boxvehicles.Items.Add(parts[0]);
string test = FileSearchRes[i];
doc.Load(FileSearchRes[i]);
List<string> name = new List<string>();
var accountNodes = doc.GetElementsByTagName("FpcBlock");
for (int j = 0; j < accountNodes.Count; j++)
{
var account = accountNodes[j].SelectSingleNode("./FPC");
if (account != null && account.Attributes != null)
{
// Read node attribute
name.Add(account.Attributes["Name"].Value + account.Attributes["Value"].Value);
}
}
i++;
}
我正在尝试从如下所示的 xml 文件中读取:
<FpcBlock Version="01">
<FPC Name="1" Value="A" Updated="false" />
<FPC Name="3" Value="B" Updated="false" />
<FPC Name="5" Value="B" Updated="false" />
<FPC Name="8" Value="B" Updated="false" />
<FPC Name="10" Value="B" Updated="false" />
</FpcBlock>
问题出在以下行:
var accountNodes = doc.GetElementsByTagName("FpcBlock");
accountnodes 的计数为 1,这是不正确的,因为我有更多节点。因此,只有第一个节点被添加到名称中。我做错了什么?
编辑:对不起,如果我感到困惑。我想将下面的所有行保存在列表中。我想要的是列表应该是这样的:
1A
3B
5B
等等。所以我保存名称和值。但目前我只得到第一行 1A.
编辑 2:
我误解了 GetElementsByTagName()
方法。通过更改为 GetElementsByTagName("FPC")
它应该是问题。
您正在查询名为 FpcBlock
的元素,但似乎需要名为 FPC
的元素。如果您更改为查找您实际要查找的元素,那么您可能会发现问题消失了。
也就是说,LINQ to XML 比旧的 XmlDocument
API 更现代、更干净 API。使用这个会更好:
var nameValues =
from fpc in doc.Descendants("FPC")
select new
{
Name = (int) fpc.Attribute("Name"),
Value = (string) fpc.Attribute("Value")
};
有关工作演示,请参阅 this fiddle。