У меня есть xml, отправленный третьей стороной, и я хочу его проверить.
XElement xTree = XElement.Parse(@"<Container>
<TrackingReferences>
<TrackingReference>
<TrackingName>Donny</TrackingName>
<TrackingCodes>
<TrackingCode>
<Name></Name>
</TrackingCode>
<TrackingCode>
<Name>DisplayThis</Name>
</TrackingCode>
<TrackingCode>
<Name></Name>
</TrackingCode>
</TrackingCodes>
</TrackingReference>
</TrackingReferences>
</Container>");
IEnumerable<XElement> childList = xTree.Element("TrackingReferences").Descendants("TrackingReference").Where(
tr => (
tr.Element("TrackingName") != null && !tr.Element("TrackingName").IsEmpty && !String.IsNullOrEmpty(tr.Element("TrackingName").Value) &&
tr.Descendants("TrackingCodes").Any(
tc => tc.HasElements &&
tc.Elements("TrackingCode").Any(
code => code.Element("Name") != null && !code.Element("Name").IsEmpty && !String.IsNullOrEmpty(code.Element("Name").Value)
)
)
)
);
Я не могу понять, как вернуть потомков, которых я хотел бы.
Моя проблема заключается в том, что я хочу, чтобы элемент TrackingReference содержал потомков TrackingCode только тогда, когда этот TrackingCode имеет Name. элемент, который не является нулевым или пустым.
Пример ниже возвращает:
<TrackingReference>
<TrackingName>Donny</TrackingName>
<TrackingCodes>
<TrackingCode>
<Name></Name>
</TrackingCode>
<TrackingCode>
<Name>DisplayThis</Name>
</TrackingCode>
<TrackingCode>
<Name></Name>
</TrackingCode>
</TrackingCodes>
</TrackingReference>
Однако в этом примере я не хочу, чтобы возвращались первый и третий элементы TrackingCode, только второй, так как он имеет элемент Name со значением, например:
<TrackingReference>
<TrackingName>Donny</TrackingName>
<TrackingCodes>
<TrackingCode>
<Name>DisplayThis</Name>
</TrackingCode>
</TrackingCodes>
</TrackingReference>
Это первый раз, когда я пробовал запрос LINQ к XML, поэтому любые советы о том, как сделать запрос более чистым/эффективным, будут высоко оценены, или если я пойду по этому пути неправильно.