Десериализация XML с использованием XSD/генерации кода — ошибка синтаксического анализа

Я пытаюсь десериализовать XML-документ с помощью XSD. Ошибка, которую я получаю:

"Ошибка в XML-документе (22, 8)".

InnerException это

"Входная строка имеет неверный формат."

Теперь в строке 22 моего образца XML-документа есть только это:

<PremiumPaymentDate>2012-08-08</PremiumPaymentDate>

Насколько я вижу, в этом нет ничего плохого. XSD указывает эту строку примерно так:

<xs:element name="PremiumPaymentDate" type="xs:date" minOccurs="0"/>

И свойство, которое он пытается сопоставить, выглядит так:

[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, DataType="date")]
public System.DateTime PremiumPaymentDate {
    get {
        return this.premiumPaymentDateField;
    }
    set {
        this.premiumPaymentDateField = value;
    }
}

Я пытался полностью удалить это поле, восстановить файл кода из XSD, изменить XSD вокруг, изменить значение minOccurs, изменить формат поля, полностью удалить данные поля, и ничего не работает.

Мне также интересно, почему все работает до строки 22, потому что они примерно на 17 полей выше этого, которые работают нормально, и некоторые из них представляют собой даты, которые настроены точно так же. Этот просто не хочет разбирать по какой-то причине.

Редактировать:

Эти даты работают. Они находятся над соответствующей датой в документе. Вот XSD для того, который работает:

<xs:element name="effectivedate" type="xs:date" minOccurs="1"/>

А вот пример XML для того же:

<effectivedate>2012-06-08</effectivedate>

И свойство кода для него:

[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, DataType="date")]
        public System.DateTime effectivedate {
            get {
                return this.effectivedateField;
            }
            set {
                this.effectivedateField = value;
            }
        }

Есть идеи?


person Scott    schedule 25.07.2012    source источник
comment
Можете ли вы предоставить больше кода вашего сопоставления (свойства с DateTime, которые работают)?   -  person Harry89pl    schedule 25.07.2012
comment
Конечно... Я отредактирую свой вопрос.   -  person Scott    schedule 25.07.2012
comment
Это работает, когда вы меняете имя свойства с effectivedate на EffectiveDate? (то же самое в узле xml и определении XSD).   -  person Harry89pl    schedule 25.07.2012
comment
Есть куча полей, через которые он проходит, которые являются правильным случаем. Дата, которую я опубликовал, просто не имеет этого, но другие делают эту работу. Я тоже так подумал, ха-ха.   -  person Scott    schedule 25.07.2012
comment
в строке отладки PremiumPaymentDate нет пустых знаков, таких как &nbsp; или просто пробел? Прежде чем пытаться разобрать это значение, используйте для него метод Trim().   -  person Harry89pl    schedule 25.07.2012
comment
Прежде всего, вы пытались проверить XML на XSD? Если он проходит проверку, вы столкнулись с ошибкой... тогда вы будете просить обходной путь; Я бы попытался воспроизвести с помощью XSD и XML, а затем опубликовать это здесь. В противном случае может потребоваться исправление XML.   -  person Petru Gardea    schedule 25.07.2012
comment
@Petru Gardea кажется прав. Я пытался воспроизвести ваш сценарий ошибки, но не смог, всегда работает. Источник: dl.dropbox.com/u/49510149/stackoverflow/dotnet/   -  person Hailton    schedule 25.07.2012
comment
Как мне выполнить проверку?   -  person Scott    schedule 25.07.2012
comment
Взгляните на этот пост.   -  person Petru Gardea    schedule 25.07.2012
comment
Это может быть натянуто, но иногда номера строк, сообщаемые во время проверки, могут быть неверными. Может проблема в другом узле?   -  person Kit    schedule 28.08.2012


Ответы (1)


Можете ли вы проверить, существует ли предыдущий узел?

Вероятно, ошибка не в этом узле, но ваша схема ожидает какой-то другой узел, который предшествует этому узлу, но он не существует.

например, если ваш xsd ниже

...
<xs:element name="someelsenode" type="xs:date" minOccurs="1"/>
<xs:element name="missingnode" type="xs:date" minOccurs="1"/>
<xs:element name="effectivedate" type="xs:date" minOccurs="1"/>
...

но ваш xml выглядит так, как показано ниже

...
<someelsenode>2012-06-08</someelsenode>
<effectivedate>2012-06-08</effectivedate>
...

то вы можете получить «В XML-документе есть ошибка (22, 8)». ошибка. это будет ссылаться на правильную строку узла и столбец, но на самом деле он пытается сказать, что другого узла нет.

поэтому перед <effectivedate>2012-06-08</effectivedate> должно быть <missingnode>2012-06-08</missingnode>

person Ozgur    schedule 19.10.2012