使用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>
试试这个:
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);
}