使用Linq读取XMl,返回空对象

本文关键字:返回 对象 XMl Linq 读取 使用 | 更新日期: 2023-09-27 18:20:40

我正在尝试读取一个xml

示例XML

<customer-list>
   <customer>
      <FirstName>B</FirstName>
      <LastName>C</LastName>
      <Email></Email>
      <OptInEmail>1</OptInEmail>
      <Phone>9056953000</Phone>
      <Address1></Address1>
      <Address2>70 East Beaver Creek Rd</Address2>
      <City>Richmond Hill</City>
      <State>ON</State>
      <ZipCode>L4B3B2</ZipCode>
      <CountryCode>CA</CountryCode>
   </customer>
   <customer>
    <FirstName>P</FirstName>
    <LastName>M</LastName>
    <Email></Email>
    <OptInEmail>1</OptInEmail>
    <Phone>7045955246</Phone>
    <Address1>Residence Inn</Address1>
    <Address2>55 Minthorn Blvd</Address2>
    <City>Markham</City>
    <State>ON</State>
    <ZipCode>L3T7Y9</ZipCode>
    <CountryCode>CA</CountryCode>
   </customer>  
</customer-list>

读取代码

public void ReadXml(string path)
        {
            var xdoc = XDocument.Load(path);
            var customer = from node in xdoc.Descendants("customer")
                            select new
                            {
                                FirstName = (string)node.Attribute("FirstName").Value,
                                LastName = (string)node.Attribute("LastName").Value,
                                Email = (string)node.Attribute("Email").Value,
                                OptInEmail = (string)node.Attribute("OptInEmail").Value,
                                Phone = (string)node.Attribute("Phone").Value,
                                Address1 = (string)node.Attribute("Address1").Value,
                                Address2 = (string)node.Attribute("Address2").Value,
                                City = (string)node.Attribute("City").Value,
                                State = (string)node.Attribute("State").Value,
                                ZipCode = (string)node.Attribute("ZipCode").Value,
                                CountryCode = (string)node.Attribute("CountryCode").Value
                            };
            foreach (var item in customer)
            {
                var test = item.FirstName;
            }
        }

但每次我尝试访问它时,Cutomer都是空的。没有从xml读取值??任何建议。。。

基于leo建议更新了代码

 public void ReadXml(string path)
    {
        var xdoc = XDocument.Load(path);
        var customer = from node in xdoc.Descendants("customer")
                        select new
                        {
                            FirstName = node.Element("FirstName"),
                            LastName = node.Element("LastName"),
                            Email = node.Element("Email"),
                            OptInEmail = node.Element("OptInEmail"),
                            Phone = node.Element("Phone"),
                            Address1 = node.Element("Address1"),
                            Address2 = node.Element("Address2"),
                            City = node.Element("City"),
                            State = node.Element("State"),
                            ZipCode = node.Element("ZipCode"),
                            CountryCode = node.Element("CountryCode")
                        };
        foreach (var item in customer)
        {
            var test = item.FirstName;
        }
    }

不工作

根据salem22建议更新了代码。没有业务规则或逻辑返回。阅读后,只需浏览foreach循环即可运行,不起作用

public void ReadXml(string path)
        {
            var xdoc = XDocument.Load(path);
            var customer = from node in xdoc.Descendants("customer")
                            select new
                            {
                                FirstName = node.Element("FirstName").Value,
                                LastName = node.Element("LastName").Value,
                                Email = node.Element("Email").Value,
                                OptInEmail = node.Element("OptInEmail").Value,
                                Phone = node.Element("Phone").Value,
                                Address1 = node.Element("Address1").Value,
                                Address2 = node.Element("Address2").Value,
                                City = node.Element("City").Value,
                                State = node.Element("State").Value,
                                ZipCode = node.Element("ZipCode").Value,
                                CountryCode = node.Element("CountryCode").Value
                            };
            foreach (var item in customer)
            {
                var test = item.FirstName;
            }
        }

添加我在xdoc中读取后看到的实际文件

<customers xmlns="http://www.demandware.com/xml/impex/customer/2007-05-31">
 <customer-list>
 <customer>
  <FirstName>B</FirstName> 
  <LastName>C</LastName> 
  <Email></Email> 
  <OptInEmail>1</OptInEmail> 
  <Phone>9056953000</Phone> 
  <Address1>On</Address1> 
  <Address2>70 East Beaver Creek Rd</Address2> 
  <City>Richmond Hill</City> 
  <State>ON</State> 
  <ZipCode>L4B3B2</ZipCode> 
  <CountryCode>CA</CountryCode> 
  </customer>
 <customer>
  <FirstName>P</FirstName> 
  <LastName>M</LastName> 
  <Email></Email> 
  <OptInEmail>1</OptInEmail> 
  <Phone>7045955246</Phone> 
  <Address1>Residence Inn</Address1> 
  <Address2>55 Minthorn Blvd</Address2> 
  <City>Markham</City> 
  <State>ON</State> 
  <ZipCode>L3T7Y9</ZipCode> 
  <CountryCode>CA</CountryCode> 
  </customer>

  </customer-list>
  </customers>

使用Linq读取XMl,返回空对象

试试这个:

  XDocument xd=Xdocument.Load(path);
  XNamespace ns = "http://www.demandware.com/xml/impex/customer/2007-05-31";
  var customer=from node in xd.Descendants(ns+"customer")
               select new
               {
                 FirstName=node.Element(ns+"FirstName").Value,
                 ...
               };

您有Elements而不是Attributes。使用XElement.Element(string)方法

FirstName = (string)node.Element("FirstName"),
LastName = (string)node.Element("LastName"),
...

如果要进行显式强制转换,也不要使用Value属性。这毫无意义。Value已经是一个字符串,如果找不到元素,它将引发异常。

您需要用Element更改对Attribute的调用,因为您的customer没有任何属性,并且您对获取内部元素的文本感兴趣。替换与下面类似的所有方法调用。。。

FirstName = (string)node.Attribute("FirstName").Value,

用这个。。。

FirstName = node.Element("FirstName").Value,

您一无所获,因为没有任何属性可供读取。元素"customer"是一个complexType元素,它有子元素(firstname、lastname等)。为了读取它们的值,您必须从node更改方法。属性到节点。要素使用您发布的XML,我运行了以下代码并获得了所需的结果。

var xdoc = XDocument.Load(path);
var customer = from node in xdoc.Descendants("customer")
select new
{
    FirstName = node.Element("FirstName").Value.ToString(),
    LastName = node.Element("LastName").Value.ToString(),
    Email = node.Element("Email").Value.ToString(),
    foreach (var item in customer)
    {
        var test = item.FirstName;
        Console.WriteLine(test);
    }