我如何将 Linq 结果过滤到仅 return 选定的 XML 列
how can i filter the Linq results to only return selected XML column
只是想问一下如何将 Linq 结果过滤到仅 return 选定的 XML 列,根据下面的 XML 我只想 return 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; }
}
只是想问一下如何将 Linq 结果过滤到仅 return 选定的 XML 列,根据下面的 XML 我只想 return 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; }
}