<?xml version="1.0" encoding="ISO-8859-1"?>
<kdd>
<Table>
<robel ID="1">
<groof NAME="GOBS-1">
<sintal ID="A">Cynthia1</sintal>
<sintal ID="B">Sylvia2</sintal>
<sintal ID="C">Sylvia3</sintal>
<sintal ID="D">Sylvia4</sintal>
</groof>
<groof NAME="GOBS-2">
<sintal ID="A">Cynthia1</sintal>
<sintal ID="B">Cynthia2</sintal>
<sintal ID="C">Cynthia3</sintal>
<sintal ID="D">Cynthia4</sintal>
</groof>
<groof NAME="GOBS-3">
<sintal ID="A">Daniella1</sintal>
<sintal ID="B">Daniella2</sintal>
<sintal ID="C">Daniella3</sintal>
<sintal ID="D">Daniella4</sintal>
</groof>
</robel>
</Table>
</kdd>
我想获得GOBS-2的Cynthia1。注意GOBS-1还有另一个Cynthia1
foreach (XElement element in doc.Descendants("groof"))
{
string mmname = element.Attribute("NAME").Value.ToString();
if (mmname == "GOBS-2")
{
bool found = false;
foreach (XElement element1 in doc.Descendants("sintal"))
{
if (found == false)
{
string CurrentValue = (string)element1;
if ("Cynthia1" == CurrentValue)
{
try
{
//do something
found = true;
}
catch (Exception e)
{
}
}
}
}
}
问题是,在从Gobs-2找到Cynthia1后,循环上升到Gobs-1。 我认为第二个sintal的foreach存在问题 也许我应该使用不同的东西。 我想在找到Gobs-2的sintal后它就停止了。似乎2个foreach没有关联。在每个人身上运行
答案 0 :(得分:11)
我想获得GOBS-2的Cynthia1
您可以使用Linq更精确地实现目标:
XElement cynthia = doc
.Descendants("groof")
.Where(g => g.Attribute("NAME").Value == "GOBS-2")
.Elements("sintal")
.Where(s => s.Value == "Cynthia1") // or Attribute("ID") == "A"
.Single();
答案 1 :(得分:2)
你在内部foreach循环中有一个错误,你应该迭代element.Descendants("sintal")
而不是doc.Descendants("sintal")
foreach (XElement element in doc.Descendants("groof"))
{
string mmname = element.Attribute("NAME").Value.ToString();
if (mmname == "GOBS-2")
{
bool found = false;
foreach (XElement element1 in element.Descendants("sintal"))
{
if (found == false)
{
string CurrentValue = (string)element1;
if ("Cynthia1" == CurrentValue)
{
try
{
//do something
found = true;
}
catch (Exception e)
{
}
}
}
}
}
}
您从第一个sintal
标记获取groof
元素的原因是doc.Descendants("sintal")
查找文档中的第一个sintal标记,而不是您之前选择的父节点。< / p>