2010-12-15 109 views
0

im ayant un problème avec un XDocument créer le XDocument parser un xml retourné à partir d'un service web. Voici le xmlXDocument ne recevra pas les descendants bien que le choisi

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

maintenant, quand je tente d'appeler les Descendants de dire lets « VentaOnlineInfo » il dit que son vide.

est ici le code

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 son rempli d'une chaîne contenant le XML.

Quelqu'un sait pourquoi il ne cesse de dire que le descendant n'existe pas? Toute aide sera apréciée

Répondre

2

Vous avez quelques problèmes ici. Tout d'abord, il semble que vous ayez mis Attribute lorsque vous vouliez dire Element dans la clause select. Deuxièmement, vous devez inclure l'espace de noms lors de l'obtention de ces éléments. Troisièmement, vous ne pouvez pas convertir un DateTime, vous devez l'analyser. (EDIT: tant que vous ne faites pas explicitement référence à la propriété Value de l'élément, elle sera castée)

Voici le code que vous avez publié avec ces problèmes corrigés. Il semble fonctionner pour moi:

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; 
+0

il peut s'agir d'une erreur, mais elle échoue toujours. il ne fait pas exception, mais il ne remplira pas la grille de données. – ShinyDarkStone

+0

J'ai trouvé quelques autres problèmes, voir ma réponse éditée. Je l'ai essayé dans LinqPAD et cela a fonctionné avec ces changements. –

+0

Vous pouvez * lancer * vers DateTime. Il y a une conversion explicite. –

0

Vous devez les chercher subvalues ​​comme éléments et comprennent l'espace de noms. Voici une courte mais complète exemple qui fonctionne:

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

Maintenant, si vous faites cela et vous êtes toujours rien ne se passe, cela suggère que quelque chose d'étrange se passe dans votre liaison.

+0

Tnx maintenant ça marche, je ne peux pas voter, mais c'était utile aussi – ShinyDarkStone