В документе XML есть ошибка (1, 41) - PullRequest
9 голосов
/ 22 марта 2012

Когда я выполняю десериализацию xml, я получаю сообщение «В документе XML есть ошибка (1, 41)». , Может кто-нибудь сказать мне, в чем проблема все.

 public static T DeserializeFromXml<T>(string xml)
        {
            T result;
            XmlSerializer ser = new XmlSerializer(typeof(T));
            using (TextReader tr = new StringReader(xml))
            {
                result = (T)ser.Deserialize(tr);
            }
            return result;
        }

Я использую эту функцию, чтобы сделать это.

<?xml version='1.0' encoding='utf-16'?>
<Message>
<FirstName>Hunt</FirstName>
<LastName>DAvid</LastName>
</Message>

Ответы [ 6 ]

17 голосов
/ 22 марта 2012

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

[Serializable, XmlRoot("Message")]
public class Message
{
    public string FirstName { get; set; }

    public string LastName { get; set; }
}

Это прекрасно работает для меня:

string xml = File.ReadAllText("c:\\Message.xml");
var result = DeserializeFromXml<Message>(xml);

MSDN, XmlRoot.ElementName :

Имя корневого элемента XML, который создается и распознается в экземпляре XML-документа. По умолчанию используется имя сериализованного класса .

Так что, возможно, ваше имя класса не Message, и именно поэтому десериализатор не смог найти его, используя поведение по умолчанию.

2 голосов
/ 26 февраля 2015

Сначала проверьте переменные, объявленные с использованием правильных типов данных. У меня была та же проблема, что я проверил, по ошибке я объявил SAPUser как тип данных int, чтобы произошла ошибка. Еще одна вещь, XML-файл хранит свои данные, используя концепцию, такую ​​как массив, но его первый индекс начинает иметь +1. например если ошибка в (7,2), то всегда проверяйте 6-ю строку .....

2 голосов
/ 07 февраля 2014

У меня было то же самое. Все сводится к «d» вместо «D» в имени тега в схеме.

2 голосов
/ 13 сентября 2013

Согласился с ответом от sll, но столкнулся с другим препятствием, указавшим пространство имен в атрибутах, при получении возврата XML, что пространство имен не было включено и, таким образом, не смог найти класс.

Мне пришлось найти обходной путь для указания пространства имен в атрибуте, и это сработало.

т.

[Serializable()]
    [XmlRoot("Patient", Namespace = "http://www.xxxx.org/TargetNamespace")]
    public class Patient

генерироваться

<Patient xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.xxxx.org/TargetNamespace">

но мне пришлось изменить его на

[Serializable()]
[XmlRoot("Patient")]
public class Patient

, который сгенерирован до

<Patient xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

Это решило мою проблему, надеюсь, это поможет кому-то еще.

0 голосов
/ 15 апреля 2018

В моем случае ожидалось значение с плавающей запятой, где xml имел нулевое значение, поэтому обязательно поищите типы данных с плавающей запятой и int в вашей карте xsd

0 голосов
/ 21 октября 2015

В проекте WEC7, над которым я работаю, я получил похожую ошибку.Файл, в котором я сериализовался, был сериализован из массива объектов, поэтому я решил, что с XML все в порядке.Кроме того, у меня это работало для нескольких предыдущих классов, так что это было довольно загадкой.

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

Кажется, я где-то читал, что это требовалось.Я думаю, это так.

...