C# 使用C获取XML中具有特定名称的标记#
我有XML文件,并将其解析为XDocument。 我需要获取所有名为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
的标签,但有一个问题
标记
包含另外两个实体标记作为其子项。(还有许多其他标签)
当我这样做时:
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中的某些内容