XDocument不会得到后代,虽然选择了一个存在
问题描述:
即时通讯与XDocument有点儿麻烦创建XDocument解析从web服务返回的xml。 这里是XMLXDocument不会得到后代,虽然选择了一个存在
<VentaOnlineList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/">
<VentasList>
<VentaOnlineInfo>
<ProcessDate>2010-11-01T00:00:00</ProcessDate>
<TicketDate>2010-11-01T00:00:00</TicketDate>
<DeliveryDate>2010-09-29T00:00:00</DeliveryDate>
<DwhLastMonthProcessData>0</DwhLastMonthProcessData>
<DwhLastMonthTicketDate>0</DwhLastMonthTicketDate>
<PsucLastMonthDeliveryDate>0</PsucLastMonthDeliveryDate>
<DwhSelectedMonthProcessData>-6.54</DwhSelectedMonthProcessData>
<DwhSelectedMonthTicketDate>-6.54</DwhSelectedMonthTicketDate>
<PsucSelectedMonthDeliveryDate>-6.54</PsucSelectedMonthDeliveryDate>
<DwhNextMonthProcessData>0</DwhNextMonthProcessData>
<DwhNextMonthTicketDate>0</DwhNextMonthTicketDate>
<PsucNextMonthDeliveryDate>0</PsucNextMonthDeliveryDate>
</VentaOnlineInfo>
</VentasList>
<Error>
<ErrorFlag>false</ErrorFlag>
</Error>
</VentaOnlineList>
现在,当我尝试打电话让后人从说“VentaOnlineInfo”它说,它是空的。
这里是代码
XDocument xmlSell = XDocument.Parse(xmlContent);
XNamespace nameSpace = "http://tempuri.org/";
var venta = from ventas in xmlSell.Descendants(nameSpace + "VentaOnlineInfo")
select new VentaDigital
{
ProcessDate = (DateTime)ventas.Attribute("ProcessDate"),
TicketDate = (DateTime)ventas.Attribute("TicketDate"),
DeliveryDate = (DateTime)ventas.Attribute("DeliveryDate")
};
ventasDigitales.ItemsSource = venta;
xmlContent其充满包含XML的字符串。
有人知道为什么它一直说后裔不存在? 任何帮助将被折扣
答
您在这里有几个问题。
首先,它看起来像你把属性,当你的意思是选择子句中的元素。其次,在获取这些元素时,您需要包含名称空间。
第三,你不能强制转换为DateTime,你必须解析它。
(编辑:只要你没有明确引用元素的价值属性,它会投)
这是您发布的代码与这些问题修复。这似乎为我工作:
XDocument xmlSell = XDocument.Parse(x);
XNamespace nameSpace = "http://tempuri.org/";
var venta = from ventas in xmlSell.Descendants(nameSpace + "VentaOnlineInfo")
select new VentaDigital
{
ProcessDate = (DateTime)ventas.Element(nameSpace + "ProcessDate"),
TicketDate = (DateTime)ventas.Element(nameSpace + "TicketDate"),
DeliveryDate = (DateTime)ventas.Element(nameSpace + "DeliveryDate")
};
ventasDigitales.ItemsSource = venta;
答
你需要将它们取子值作为元素和包括命名空间。下面是其工作的一个简短但完整的例子:如果你这样做,你就仍然没有得到任何
using System;
using System.Linq;
using System.Xml.Linq;
class Test
{
static void Main()
{
string xml = @"<VentaOnlineList
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xmlns:xsd='http://www.w3.org/2001/XMLSchema'
xmlns='http://tempuri.org/'>
<VentasList>
<VentaOnlineInfo>
<ProcessDate>2010-11-01T00:00:00</ProcessDate>
<TicketDate>2010-11-01T00:00:00</TicketDate>
<DeliveryDate>2010-09-29T00:00:00</DeliveryDate>
<DwhLastMonthProcessData>0</DwhLastMonthProcessData>
<DwhLastMonthTicketDate>0</DwhLastMonthTicketDate>
<PsucLastMonthDeliveryDate>0</PsucLastMonthDeliveryDate>
<DwhSelectedMonthProcessData>-6.54</DwhSelectedMonthProcessData>
<DwhSelectedMonthTicketDate>-6.54</DwhSelectedMonthTicketDate>
<PsucSelectedMonthDeliveryDate>-6.54</PsucSelectedMonthDeliveryDate>
<DwhNextMonthProcessData>0</DwhNextMonthProcessData>
<DwhNextMonthTicketDate>0</DwhNextMonthTicketDate>
<PsucNextMonthDeliveryDate>0</PsucNextMonthDeliveryDate>
</VentaOnlineInfo>
</VentasList>
<Error>
<ErrorFlag>false</ErrorFlag>
</Error>
</VentaOnlineList>";
XDocument xmlSell = XDocument.Parse(xml);
XNamespace nameSpace = "http://tempuri.org/";
var venta = from ventas in xmlSell.Descendants(nameSpace + "VentaOnlineInfo")
select new
{
ProcessDate = (DateTime)ventas.Element(nameSpace + "ProcessDate"),
TicketDate = (DateTime)ventas.Element(nameSpace + "TicketDate"),
DeliveryDate = (DateTime)ventas.Element(nameSpace + "DeliveryDate")
};
foreach (var x in venta)
{
Console.WriteLine(x);
}
}
}
现在,这将表明一个奇怪的现象在你的绑定正在发生的事情。
+0
Tnx现在它的工作原理,我不能投票,但这也是有用的 – ShinyDarkStone 2010-12-15 19:40:07
它可能是一个错误,但它仍然失败。它不会引发异常,但它不会填充数据网格nethier。 – ShinyDarkStone 2010-12-15 19:08:52
我发现了一些问题,请参阅我编辑的答案。我在LinqPAD上试了一下,它和这些改变一起工作。 – 2010-12-15 19:10:06
您*可*转换为DateTime。有一个明确的转换。 – 2010-12-15 19:13:43