2010-12-15 3 views
0

Ich habe ein Problem mit einem XDocument. Erstelle das XDocument, um ein XML zu analysieren, das von einem Webservice zurückgegeben wurde. Hier wird die xml istXDocument erhält keine Nachfolger, obwohl die gewählte existiert

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

jetzt, wenn ich versuche, die Nachkommen nennen können sagen, von „VentaOnlineInfo“, heißt es, dass seine leer.

hier ist der 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 seine mit einem String gefüllt, die den XML-Code enthält.

Jemand weiß, warum es sagt, dass die Nachkommen nicht existieren? Jede Hilfe wird geschätzt

Antwort

2

Sie haben ein paar Probleme hier.

Zuerst sieht es so aus, als ob Sie Attribut setzen, wenn Sie Element in der select-Klausel meinen. Zweitens müssen Sie beim Abrufen dieser Elemente den Namespace einschließen. Drittens können Sie nicht zu einem DateTime-Objekt konvertieren, das Sie analysieren müssen. (BEARBEITEN: solange Sie nicht explizit auf die Value-Eigenschaft des Elements verweisen, wird es umgewandelt)

Hier ist der Code, den Sie mit diesen behobenen Problemen veröffentlicht. Es scheint für mich zu arbeiten:

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

Es kann ein Fehler sein, aber es scheitert immer noch. Es löst keine Ausnahme aus, aber es füllt nicht das Datagrid-Nethier. – ShinyDarkStone

+0

Ich habe ein paar weitere Probleme gefunden, siehe meine bearbeitete Antwort. Ich habe es in LinqPAD versucht und es hat mit diesen Änderungen funktioniert. –

+0

Sie können * zu DateTime umwandeln. Es gibt eine explizite Konvertierung. –

0

Sie müssen sie Teilwerte als Elemente holen und umfassen den Namespace. Hier ist ein kurzes, aber vollständiges Beispiel, das funktioniert:

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

Nun, wenn Sie das tun und du bist noch nichts bekommen, dass würde vorschlagen, dass etwas Seltsames geschieht in Ihrer Bindung.

+0

Tnx jetzt funktioniert es, ich kann nicht stimmen, aber das war auch nützlich – ShinyDarkStone

Verwandte Themen