C #: десериализация XML-файла Ошибка (думаю, что это проблема с пространством имен - не могу на всю жизнь решить это хотя) - PullRequest
5 голосов
/ 12 мая 2009

Я десериализирую XML-файл, полученный из веб-службы одного из наших клиентов.

Проблема в том, что после создания класса с помощью xsd.exe я десериализирую файл и получаю обычное сообщение «В документе XML есть ошибка (2, 2)». визуальная студийная ошибка. Я предполагаю, что это строка 2, которая указывает на объявления пространства имен:

Начало XML-файла:

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"     xmlns:xsd="http://www.w3.org/1999/XMLSchema" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance">
 <soapenv:Body><MXWorkorderOutResp language="EN" xmlns="http://www.mro.com/mx/integration" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Header event="0" operation="Response" rsCount="8" rsStart="0" rsTotal="8">
    <SenderID build="127" dbbuild="V600-467" majorversion="6" minorversion="1" type="MAXIMO">MX</SenderID>
    <CreationDateTime>2009-05-11T09:48:51+01:00</CreationDateTime>
    <RecipientID>SUPPLIER</RecipientID>
    <MessageID>12420317323327108</MessageID>
  </Header>
  <Content>
    <MXWORKORDER>
      <WORKORDER>

Топ класса:

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://www.mro.com/mx/integration")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://www.mro.com/mx/integration", IsNullable=false)]


public partial class MXWorkorderOutResp {

private MXWorkorderOutRespHeader[] headerField;

private MXWorkorderOutRespContentMXWORKORDERWORKORDER[][][] contentField;

private string languageField;

/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("Header")]
public MXWorkorderOutRespHeader[] Header {
    get {
        return this.headerField;
    }
    set {
        this.headerField = value;
    }
}

/// <remarks/>
[System.Xml.Serialization.XmlArrayItemAttribute("MXWORKORDER", typeof(MXWorkorderOutRespContentMXWORKORDERWORKORDER[]), IsNullable=false)]
[System.Xml.Serialization.XmlArrayItemAttribute("WORKORDER", typeof(MXWorkorderOutRespContentMXWORKORDERWORKORDER), IsNullable=false, NestingLevel=1)]
public MXWorkorderOutRespContentMXWORKORDERWORKORDER[][][] Content {

Я предполагаю, что есть ошибка с:

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://www.mro.com/mx/integration")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://www.mro.com/mx/integration", IsNullable=false)]

часть XML, но я понятия не имею, на что его изменить или чего хочет VS.

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

РЕДАКТИРОВАТЬ: Есть внутреннее исключение да! Простите, ребята!

{"<Envelope xmlns='http://schemas.xmlsoap.org/soap/envelope/'> was not expected."}

Так как мне добавить это объявление пространства имен в класс?

1 Ответ

6 голосов
/ 12 мая 2009

Мыльный конверт не является частью вашего сериализованного объекта. Это часть транспортного протокола SOAP. Вам нужно удалить свой объект из конверта, а не заставлять ваш объект иметь дело с конвертом.

Вместо того, чтобы брать весь XML-файл (который по какой-то причине включает мыльный конверт), вам нужно взять первого ребенка в soap: body и использовать TH для десериализации вашего объекта.

Зацените это ТАК сообщение ...

Использование C # и XDocument / XElement для анализа ответа мыла

... который обрабатывает файл.

...