Проблема намного проще, если вы создадите итератор:
public static IEnumerable<XElement> FindElements(XElement d, string test)
{
foreach (XElement e in d.Descendants()
.Where(p => p.Attribute("text").Value == test))
{
yield return e;
if (e.Parent != null)
{
yield return e.Parent;
}
}
}
Используйте его везде, где вы будете использовать запрос Linq, например ::
List<XElement> elms = FindElement(d, "Visual Arts").ToList();
или
foreach (XElement elm in FindElements(d, "Visual Arts"))
{
...
}
Edit:
Теперь я вижу, что код, приведенный выше, не тот, о котором просил спрашивающий. Но то, что спрашивал спрашивающий, немного странно, как мне кажется, поскольку XElement
, который он хочет вернуть, является совершенно новым объектом, а не чем-то в существующем документе.
Тем не менее, честь служить. Взирай на мои дела, могущественный и отчаянный:
XElement result = doc.Descendants()
.Where(x => x.Attribute("text").Value == test)
.Select(
x => x.Parent != null && x.Parent.Attribute("text") != null
? new XElement(
x.Parent.Name,
new XAttribute("text", x.Parent.Attribute("text").Value),
new XElement(
x.Name,
new XAttribute("text", x.Attribute("text").Value)))
: new XElement(
x.Name,
new XAttribute("text", x.Attribute("text").Value)))
.FirstOrDefault();