我有第三方发送的 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)
)
)
)
);
我不知道如何返回我想要的后代。
我遇到的问题是,当TrackingCode的Name元素不为空或不为空时,我只希望TrackingReference元素包含TrackingCode后代。
以下示例返回:
<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>
这是我第一次尝试对 XML 进行 LINQ 查询,因此非常感谢任何有关如何使查询更干净/高效的建议,或者如果我以错误的方式处理这个问题。