LINQ解析xml文件并从特定节点获取值

时间:2018-12-13 18:07:55

标签: c# linq-to-xml

我有一个xml文件,我尝试从特定节点中检索数据。但是有一些节点丢失,因此我想返回空字符串。以下是我的代码示例,我正在使用LINQ。

string xml = @"<root>
                <employee>
                 <name>Val1</name>
                 <age>30</age>
                </employee>
                <employee>
                 <name>Val1</name>
                 <age>30</age>
                 <position>Priest</position>
                </employee>
               </root>";             

   XElement x = XElement.Parse(xml);
   IEnumerable<XElement> details = x.Elements();
   var valLst = (from el in details 
                 where el.Element("name").Value.Equals("Val1") 
                 select el.Value).ToList();

Details对象包含2个雇员节点及其子节点,因此我想基于名称节点值获取子节点值。此外,我想为缺少的节点返回空字符串(例如位置节点)在第一部分中丢失,但在第二部分中存在

谢谢。

2 个答案:

答案 0 :(得分:1)

这是您的工作示例。你可以从这里走

string xml = @"<root>
            <employee>
             <name>Val1</name>
             <age>30</age>
            </employee>
            <employee>
             <name>Val1</name>
             <age>30</age>
             <position>Priest</position>
            </employee>
           </root>";             

XElement x = XElement.Parse(xml);
IEnumerable<XElement> details = x.Elements();
var valLst = (from el in details 
             let pos = (el.Element("position") == null ? string.Empty : el.Element("position").Value)
             where el.Element("name").Value.Equals("Val1") 
             select new {n = el.Value, p = pos}).ToList();

Console.WriteLine(valLst[0].n + " - " + valLst[0].p);
Console.WriteLine(valLst[1].n + " - " + valLst[1].p);

输出:

  

Val130-
  Val130Priest-牧师

答案 1 :(得分:0)

这将给您IEnumerable<AnonymousType>

             var valLst =(from el in details 
             select new
             {
                 Name = el.Element("name").Value,
                 Position = el.Element("position")?.Value ?? ""
             });

输出:

      "{ Name = Val1, Position =  }"
      "{ Name = Val1, Position = Priest }"`