XDocument的后代元素

9
<?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。 我认为第二个foreach对sintal存在问题, 也许我应该使用不同的东西。 我希望在找到Gobs-2的sintal后它就停止查找。似乎这两个foreach没有关联,各自运行。

2个回答

15

我想要获得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();

2
很好的回答 +1 你可以将 where 子句移动到 Single 中,以缩短 .Single(s => s.Value == "Cynthia2"); 的长度。 - crthompson
1
是的,我知道。但我并不总是觉得那更清晰。在这种情况下,这是一个抉择,我会保持这种方式。将所有步骤分开显示。 - H H

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)
                    {
                    }
                }
            }
        }
    }
}

你从第一个 groof 标签中获取 sintal 元素的原因是,doc.Descendants("sintal") 查找文档中第一个 sintal 标签,而不是你之前选择的父节点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接