使用C#在XML中获取具有特定名称的标记

时间:2016-05-27 07:24:18

标签: c# xml

我有XML文件,我已将其解析为XDocument。 我需要获取名称为<Entity>的所有标签,但存在一个问题。

标记<Entity>包含两个实体标记作为其子项。 (以及许多其他标签)。

当我这样做时:

var entity= xmlDoc.Descendants().Where(x => x.Name.LocalName == "Entity");

我当然得到了所有这些。

有没有办法告诉我:获取所有实体标签,但不是实体标签的子实体标签?

结构如下:

<Entity> --> I need to get this one
   <SomeTags>Value</SomeTags>
   <First>
     <Entity>Value</Entity> --> Skip this one
   </First>
   <Entity>Value<Entity> --> Skip this one as well
</Entity>

3 个答案:

答案 0 :(得分:2)

您可以使用以下内容:

private String path= @"C:\Temp\xml.xml"; //YOur XML path
public string getValue(string Name)
{
    try
    {
        doc = XDocument.Load(path);
        var dada = (from c in doc.Descendants(Name)
                    where c.Parent.Name!=Name
                    select c).First();
        return dada.Value;
    }
    catch (Exception)
    {
        global::System.Windows.Forms.MessageBox.Show("There was a problem with the XML");
        return "";
    }
}

答案 1 :(得分:2)

Descendants以递归方式获取所有子元素。假设您想要的元素都在相同的深度,您需要使用Elements找到他们的父元素和查询 - 这只会让直接的孩子。

doc.Descendants("parent")
    .Elements("Entity");

如果这对您的结构不起作用,您也可以按照自己的建议逐字查询 - 找到所有那些没有任何父Entity元素的Entity元素:

doc.Descendants("Entity")
    .Where(x => !x.Ancestors("Entity").Any());

答案 2 :(得分:0)

在@ CharlesMager的第二个例子的基础上,这应该是正确的语法:

doc.Descendants("Entity").Where(x => !x.Ancestors("Entity").Any());
顺便说一句:您的某个实体尚未关闭

Example on dotNetFiddle