Проблема десериализации строки XML - PullRequest
0 голосов
/ 18 июля 2011

Я получаю следующую строку XML (я удалил фактическое имя пространства имен)

<?xml version="1.0" encoding="UTF-8"?>
- <changeNotificationDto xmlns="http://www.Company.com/item" changeEventTypeCode="RemoveDeliveryPoint" messageId="10" sentDateTime="1970-01-01T00:00:00.000Z">
- <entry action="Remove" type="DeliveryPoint">
- <removeEntityNotification>
  <type>DeliveryPoint</type> 
  <compassKey>1139</compassKey> 
  </removeEntityNotification>
- <changeDelta>
  <changeDeltaType>ObjectRemove</changeDeltaType> 
  <recordId>1139</recordId> 
  <recordType>DeliveryPoint</recordType> 
  <subRecordId>2324</subRecordId> 
  <subRecordType>ExternalReference</subRecordType> 
  </changeDelta>
- <changeDelta>
  <changeDeltaType>ObjectRemove</changeDeltaType> 
  <recordId>1139</recordId> 
  <recordType>DeliveryPoint</recordType> 
  </changeDelta>
  </entry>
  </changeNotificationDto>

У меня есть веб-ссылка на «changeNotificationDto», и это сгенерировало прокси-класс (у меня нет проблем с созданием / использованием объектов этого типа в моем приложении) [Фактическое содержимое типа изменяется, но у меня есть прокси-классы из веб-ссылки для всех объектов, которые я собираюсь получить. В целях тестирования я использовал streamReader для извлечения xml из файла, но файл был записан из исходного сообщения, полученного через сокет]

У меня есть маленький тестовый жгут следующим образом: - (VB.NEt / VS2010 / FrmWrk 4)

        Dim objStreamReader As New StreamReader("C:\Testing\101 VB.NET Samples\SerializeandDeserializeXML\rdp.xml")
        Dim p2 As ChangeEventManagerService.ChangeNotificationDto
        Dim output As StringBuilder = New StringBuilder()

        Using xmlrdr As XmlReader = XmlReader.Create(New StringReader(objStreamReader.ReadToEnd()))
            Dim ws As XmlWriterSettings = New XmlWriterSettings()
            ws.Indent = True
            Using writer As XmlWriter = XmlWriter.Create(output, ws)

                ' Parse the file and display each of the nodes.
                While xmlrdr.Read()
                    Select Case xmlrdr.NodeType
                        Case XmlNodeType.Element
                            writer.WriteStartElement(xmlrdr.Name)
                        Case XmlNodeType.Text
                            writer.WriteString(xmlrdr.Value)
                        Case XmlNodeType.XmlDeclaration
                        Case XmlNodeType.ProcessingInstruction
                            writer.WriteProcessingInstruction(xmlrdr.Name, xmlrdr.Value)
                        Case XmlNodeType.Comment
                            writer.WriteComment(xmlrdr.Value)
                        Case XmlNodeType.EndElement
                            writer.WriteFullEndElement()
                    End Select
                End While
            End Using

            Console.Write(output.ToString())  '# up to this point all is good

            If x.CanDeserialize(xmlrdr) Then  '# this fails
                p2 = CType(x.Deserialize(objStreamReader), ChangeEventManagerService.ChangeNotificationDto)   '# forcing it to here throws an error as expected!
                objStreamReader.Close()
            End If

        End Using '# reader


        ''Display property values of the new product object.
        Console.WriteLine(p2.changeEventTypeCode)
        Console.WriteLine(p2.messageId)


    Catch ex As Exception
        Console.WriteLine(ex.InnerException.ToString())
        Console.WriteLine(ex.ToString())
    End Try

    Console.ReadLine()

Ошибка "Корневой элемент отсутствует".

Может ли кто-нибудь помочь мне с этим, я немного растерялся.

Я предположил, что корневым элементом является либо элемент.

Во всяком случае, я надеюсь, что все это прояснил ...

ТИА

JAB

1 Ответ

0 голосов
/ 18 июля 2011

У него есть дополнительный символ '-' в начале файла

<?xml version="1.0" encoding="UTF-8"?>
<changeNotificationDto xmlns="http://www.Company.com/item" changeEventTypeCode="RemoveDeliveryPoint" messageId="10" sentDateTime="1970-01-01T00:00:00.000Z">
<entry action="Remove" type="DeliveryPoint">
<removeEntityNotification>
<type>DeliveryPoint</type> 
<compassKey>1139</compassKey> 
</removeEntityNotification>
<changeDelta>
<changeDeltaType>ObjectRemove</changeDeltaType> 
<recordId>1139</recordId> 
<recordType>DeliveryPoint</recordType> 
<subRecordId>2324</subRecordId> 
<subRecordType>ExternalReference</subRecordType> 
</changeDelta>
<changeDelta>
<changeDeltaType>ObjectRemove</changeDeltaType> 
<recordId>1139</recordId> 
<recordType>DeliveryPoint</recordType> 
</changeDelta>
</entry>
</changeNotificationDto>

Вышеуказанный xml. Это происходит, когда вы открываете XML в IE и вставляете его в блокнот. Он несет дополнительные символы «-».

...