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

C# 使用C获取XML中具有特定名称的标记#,c#,xml,C#,Xml,我有XML文件,并将其解析为XDocument。 我需要获取所有名为的标签,但有一个问题 标记包含另外两个实体标记作为其子项。(还有许多其他标签) 当我这样做时: var entity= xmlDoc.Descendants().Where(x => x.Name.LocalName == "Entity"); 我当然都买了 有没有办法告诉我:获取所有实体标记,但不获取实体标记的子实体标记 结构如下所示: <Entity> --> I need to get this

我有XML文件,并将其解析为XDocument。 我需要获取所有名为
的标签,但有一个问题

标记
包含另外两个实体标记作为其子项。(还有许多其他标签)

当我这样做时:

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>
-->我需要买这个
价值
值-->跳过此值
值-->也跳过此值

您可以使用以下选项:

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 "";
    }
}

您可以使用以下选项:

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 "";
    }
}

子体
递归获取所有子元素。假设您想要的元素都在同一深度,您需要找到它们的父元素,并使用
元素
进行查询-这只会得到直接的子元素

doc.Descendants("parent")
    .Elements("Entity");
如果这对您的结构不起作用,您也可以按照您的建议进行逐字查询-查找所有没有任何父
实体
元素的
实体
元素:

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

子体
递归获取所有子元素。假设您想要的元素都在同一深度,您需要找到它们的父元素,并使用
元素
进行查询-这只会得到直接的子元素

doc.Descendants("parent")
    .Elements("Entity");
如果这对您的结构不起作用,您也可以按照您的建议进行逐字查询-查找所有没有任何父
实体
元素的
实体
元素:

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

基于@CharlesMager的第二个示例,这应该是正确的语法:

doc.Descendants("Entity").Where(x => !x.Ancestors("Entity").Any());
顺便说一句:你的一个实体没有关闭


基于@CharlesMager的第二个示例,这应该是正确的语法:

doc.Descendants("Entity").Where(x => !x.Ancestors("Entity").Any());
顺便说一句:你的一个实体没有关闭



如果可以避免的话,我几乎不会因为在两件不同的事情上使用同一个标签而感到不快。它也能很容易、干净地解决你的问题你是说任何标记都有
作为要跳过的值吗?@Aimnox我知道,但我刚刚得到了文件和文字:解决我的问题,你知道它是怎么回事:)@HariPrasad不,没有一个实体标记,他有实体标记(完全不同的是,他是他的后代。我想跳过他的后代,只得到他。)如果可以避免的话,我几乎不会因为在两件不同的事情上使用同一个标签而感到不快。这也会很容易地解决你的问题。你是说任何带有
值的标签都可以跳过吗?@Aimnox我知道,但我刚刚得到文件和文字:解决我的问题,你知道它是怎么回事:)@HariPrasad不,没有,只有一个实体标记,他有实体标记(与他的后代完全不同。我想跳过他的后代,只得到他:)我认为在第二个例子中,你需要
祖先
,而不是
后代
,因为尼莫想要
所有实体标记,而不是实体的子实体标记
。您的示例将返回所有的
实体
元素,这些元素根本没有
实体
类型的子元素。@ManfredRadlwimmer是的,我也这么认为,示例没有返回任何内容。两个示例的结果都是“Empty=”Enumeration Generated no results“( @CharlesMager@ManfredRadlwimmer抱歉,是的。哎呀,我修正了。@nemo_87对于第一个查询,您需要将“parent”替换为与XML匹配的内容。我假设您只给了我们一个片段(否则您的查询就是
doc.Root
!)我认为在第二个示例中,您需要的是
祖先
而不是
后代
,因为nemo需要
所有实体标记,但不是实体子实体
的实体标记。您的示例将返回所有
实体
元素,这些元素根本没有
实体
类型的子元素。@ManfredRadlwimmer是的,我认为是这样同样,这个示例并没有返回任何信息。对于这两个示例,我都得到了“Empty=”Enumeration generated no results“:(@CharlesMager@ManfredRadlwimmer抱歉,是的。哎呀,我修正了。@nemo_87对于第一个查询,您需要将“parent”替换为与XML匹配的内容。我假设您只给了我们一个片段(否则您的查询就是
doc.Root
!)我有:枚举也没有生成此查询的结果:(@ManfredRadwimmer@nemo_87对我有效,请参阅dotNetFiddleI have:Enumeration对这一个也没有结果:(@ManfredRadwimmer@nemo_87对我有效,请参见DotNetFiddle我得到:枚举未产生任何结果:(@AimnoxWhere?如果你去掉where行,它也会这样做吗?我只是将该行添加到我使用并工作的方法中,因此可能是添加的行,或者是XML/pathI中的某个内容:枚举没有产生任何结果:(@AimnoxWhere?如果去掉where行,它也会这样做吗?我只是将该行添加到一个我使用并工作的方法中,因此可能是添加的行,也可能是XML/path中的某些内容