我有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>
答案 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());
顺便说一句:您的某个实体尚未关闭