简体   繁体   English

使用Linq返回空对象读取XMl

[英]Read XMl using Linq returning empty object

I am trying to read a xml 我正在尝试读取xml

Sample 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>

Reading Code 读码

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;
            }
        }

but every time i try to access it , Cutomer is empty. 但是每次我尝试访问它时,Cutomer都是空的。 No values read from xml?? 没有从xml读取值? Any suggestion... 任何建议...

Updated code based on leo suggestion. 根据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;
        }
    }

not working. 不工作。

Updated code as per salem22 suggetions. 根据salem22建议更新了代码。 No business rule or logic return.After reading just going over foreach loop to run it, not working. 没有业务规则或逻辑返回。阅读完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;
            }
        }

Adding the actual file that i am seeing after reading in xdoc 添加在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>

Try this: 尝试这个:

  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,
                 ...
               };

You have Elements not Attributes . 您的Elements不是Attributes Use XElement.Element(string) method 使用XElement.Element(string)方法

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

Also don't use the Value property if you are making explicit cast. 如果要进行显式强制转换,也不要使用Value属性。 it's pointless. 没有用。 Value is already a string, and it will throw an exception if the element wasn't found. Value已经是一个字符串,如果找不到该元素,它将引发异常。

You need to change the call to Attribute with Element because your customer don't have any attributes and you are interested in getting the inner elements' text. 您需要使用Element更改对Attribute的调用,因为您的customer没有任何属性,并且您对获取内部元素的文本感兴趣。 Replace all method calls similar to the one below... 替换所有与以下方法类似的方法调用...

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

with this... 有了这个...

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

You get nothing because there aren't any attributes to read.The element "customer" is a complexType element that has children elements (firstname,lastname, etc.) . 您一无所获,因为没有任何要读取的属性。元素“ customer”是带有子元素(firstname,lastname等)的complexType元素。 In order to read their values you have to change the method from node.Attribute to node.Element . 为了读取它们的值,您必须将方法从node.Attribute更改为node.Element。 With the XML you posted i runned the following code and got the desired results. 使用您发布的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);
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM