XDocument не получит потомков, хотя выбранный существует - PullRequest
0 голосов
/ 15 декабря 2010

У меня возникли некоторые проблемы с XDocument, создайте XDocument, анализирующий XML, возвращенный из веб-службы.Вот теперь 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>

, когда я пытаюсь вызвать Потомков, скажем, из «VentaOnlineInfo» он говорит, что он пуст.

xmlContent заполнен строкой, содержащей XML.

Кто-то знает, почему он продолжает говорить, что потомка не существует?Любая помощь будет оценена

Ответы [ 2 ]

2 голосов
/ 15 декабря 2010

У вас есть несколько проблем здесь.

Во-первых, похоже, что вы добавили атрибут, когда подразумевали элемент в предложении выбора.Во-вторых, вам нужно включить пространство имен при получении этих элементов. В-третьих, вы не можете привести к DateTime, вы должны его проанализировать. (РЕДАКТИРОВАТЬ: если вы явно не ссылаетесь на свойство Value элемента, которое он будет приводить)

Вот код, который вы опубликовалис этими проблемами исправлены.Похоже, у меня работает:

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 голосов
/ 15 декабря 2010

Вам нужно извлечь их подзначения, так как элементы и включают пространство имен. Вот короткий, но полный пример, который работает:

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

Теперь, если вы сделаете это, и вы все еще ничего не получите, это будет означать, что в вашем связывании происходит нечто странное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...