[英]how can i filter the Linq results to only return selected XML column
只是想问一下如何过滤Linq结果以仅返回选择的XML列,根据我下面的XML,我只想仅返回EntityId
, EntityName
, YA
, ReasonText
。
<TASubmittedFileDT>
<SubmissionType>ECITESVW</SubmissionType>
<EntityId>201413671M</EntityId>
<EntityType>6</EntityType>
<EntityName>Epic</EntityName>
<YA>2018</YA>
<FileName>2018.xml</FileName>
<Reason>0</Reason>
<ReasonText>Successful</ReasonText>
<TotalECI>132961837365</TotalECI>
<Revenue>3559940928276</Revenue>
</TASubmittedFileDT>
下面是我的代码:
XDocument doc = XDocument.Load(XMLFileFullName);
//code added by Reuel
//var TASubmittedFileDT = doc.Root.Elements("{http://tempuri.org/BatchDS.xsd}TASubmittedFileDT").ToList();
//XElement root = XElement.Load(XMLFileFullName);
IEnumerable<XElement> TASubmittedFileDT = from p in doc.Root.Elements() select p;
foreach (XElement e in TASubmittedFileDT)
Console.WriteLine(e);
Console.WriteLine("GOT HERE!!!");
Console.ReadLine();
添加where
子句以检查元素的名称:
HashSet<string> names = new HashSet<string>(new string[]
{
"EntityId", "EntityName", "YA", "ReasonText"
});
var result = XDocument.Load("data.xml").Root.Descendants()
.Where(element => names.Contains(element.Name.LocalName)).ToList();
或在查询语法中:
var result = from element in XDocument.Load("data.xml").Root.Descendants()
where names.Contains(element.Name.LocalName)
select element;
一个节点,如果您的xml包含几个TASubmittedFileDT
元素,那么您将需要一些东西:
var result = XDocument.Load("data.xml").Descendants("TASubmittedFileDT")
.Select(element => element.Descendants()
.Where(element => names.Contains(element.Name.LocalName)))
.ToList();
另一个可能的解决方案是将xml反序列化为自定义对象。
var serializer = new XmlSerializer(typeof(SomeModel), new XmlRootAttribute("TASubmittedFileDT"));
var doc = XDocument.Load("example.xml");
var resultingMessage = (SomeModel)serializer.Deserialize(doc.CreateReader());
public class SomeModel
{
public string EntityId { get; set; }
public string EntityName { get; set; }
public int YA { get; set; }
public string ReasonText { get; set; }
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.