Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何过滤Linq结果以仅返回选定的XML列_C#_Linq_Linq To Xml - Fatal编程技术网

C# 如何过滤Linq结果以仅返回选定的XML列

C# 如何过滤Linq结果以仅返回选定的XML列,c#,linq,linq-to-xml,C#,Linq,Linq To Xml,我只想问一下如何过滤Linq结果以仅返回选定的XML列,根据下面的XML,我只想返回EntityId,EntityName,YA,ReasonText的值 <TASubmittedFileDT> <SubmissionType>ECITESVW</SubmissionType> <EntityId>201413671M</EntityId> <EntityType>6</EntityType> &

我只想问一下如何过滤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>

ECITESVW
201413671M
6.
史诗
2018
2018.xml
0
成功的
132961837365
3559940928276
下面是我的代码:

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();
XDocument doc=XDocument.Load(XMLFileFullName);
//代码由Reuel添加
//var tasubmittedfledt=doc.Root.Elements(“{http://tempuri.org/BatchDS.xsd}tasubmittedfled”).ToList();
//XElement root=XElement.Load(XMLFileFullName);
IEnumerable tasubmittedfledt=从doc.Root.Elements()中的p选择p;
foreach(塔苏布米特德菲尔德的XElement e)
控制台写入线(e);
Console.WriteLine(“到达这里!!!”;
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();

节点,如果您的xml包含多个
tasubmittedfled
元素,那么您需要一些东西:


另一种可能的解决方案是将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; }
}

嗨,吉拉德,谢谢你的回复和代码输入。此时,它正在输出正确的XML节点数据。只是一个问题,为什么输出包含此信息“(xmlns=“)”。这是输出datatempuri.org/BatchDS.xsd“>201413671M。位于“我的XML”顶部的信息。@kruel08-那么您正在测试的不是所讨论的确切XML。我不这样理解。@Gilad,很抱歉搞混了。这是XML的顶部部分,我无法将其包含在我的帖子中。91350111 201003116E 6我没想到它会在xml的第一部分包含一些文本。@kruel08-这是应该添加到问题正文中而不是注释中的内容。然而,这是一个后续问题,应在单独的问题中提出。我的建议是,你应该读入名称空间学院。感谢您的帮助,我们将阅读有关名称空间的内容。
var result = XDocument.Load("data.xml").Descendants("TASubmittedFileDT")
                      .Select(element => element.Descendants()
                                                .Where(element => names.Contains(element.Name.LocalName)))
                      .ToList();
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; }
}