Система десериализации XML.Исключение InvalidOperationException” не ожидалось

#c# #xml #deserialization

#c# #xml #десериализация

Вопрос:

С 2 дней я не могу десериализовать XML-файл. Я перепробовал много разных идей, но все еще безуспешно. Я получаю сообщение об ошибке при десериализации xml-файла, вызываемого phone.xml на 1, 40. Я подумал, что это может быть проблема с отсутствующим пространством имен в скобках с [XmlElement(«id»)], но выемка изменилась. Я скопировал разные идеи десериализации одинаково. Никаких успехов. Кроме того, я даже не могу преобразовать этот xml с помощью любого конвертера, но я уверен, что это правильно. Справка

jpeg пример структуры xml внутри ссылки

 using System;
using System.IO;
using System.Text;
using System.Xml.Serialization;


public class OrderedItem
{
    [XmlElement("id")]
    public string id;
    [XmlElement("username")]
    public string username;
    [XmlElement("phoneType")]
    public string phoneType;
    [XmlElement("value")]
    public string value;
}

public class Program
{
    public static void Main()
    {
        Program t = new Program();

        t.DeserializeObject("phone.xml");
    }

    private void DeserializeObject(string filename)
    {
        Console.WriteLine("Reading with TextReader");

        XmlSerializer serializer =
        new XmlSerializer(typeof(OrderedItem));

        FileStream fs = new FileStream(filename, FileMode.OpenOrCreate);
        TextReader reader = new StreamReader(fs);

        OrderedItem i;


    i = (OrderedItem)serializer.Deserialize(reader);

        Console.Write(
            i.id   "t"  
            i.username   "t"  
            i.phoneType   "t"  
            i.value   "t");
    }
}
 

Пример XML

   <?xml version="1.0" encoding="utf-8"?>
  <Objects>
    <Object>
      <Property Name="id"></Property>
      <Property Name="username">JLOCK0</Property>
      <Property Name="phoneType">phone1</Property>
      <Property Name="value">346-209-9609</Property>
    </Object>
    <Object>
      <Property Name="id"></Property>
      <Property Name="username">JLOCK0</Property>
      <Property Name="phoneType">phone2</Property>
      <Property Name="value">(478) 8085400</Property>
    </Object>
  </Objects>
 

Комментарии:

1. ДА. Вам следует попробовать сериализовать ваш OrderedItem в XML, вы увидите, что результат не соответствует вашему текущему XML — фактически они должны быть совершенно разными. Смотрите: dotnetfiddle.net/7RZj5A . Во-первых, XML содержит список объектов, а не один объект. С другой стороны, имя свойства <Property ...> не соответствует ни одному из ваших имен свойств c #.

2. @dbc Проблема в том, что я не могу ее сериализовать. Я имею в виду, что я получу такие данные с отсутствующими данными, и я должен использовать их как есть

3. ОК. Это был не ответ, просто комментарий. Смысл комментария заключался в том, что вы можете отлаживать проблемы с де сериализацией, сериализуя и сравнивая то, что вы написали, с тем, что вам нужно прочитать.

4. Путь «phone.xml » указывает на текущую папку приложения. Убедитесь, что файл с этим именем указан правильно в выходном каталоге вашего проекта.

Ответ №1:

 public class Objects
{
    [XmlElement("Object")]
    public OrderedItem[] Items;
}

public class OrderedItem
{
    [XmlElement("Property")]
    public Property[] Properties;
}

public class Property
{
    [XmlAttribute]
    public string Name { get; set; }
    [XmlText]
    public string Value { get; set; }
}
 
 var serializer = new XmlSerializer(typeof(Objects));

using (var fs = new FileStream(filename, FileMode.Open))
{
    var objects = (Objects)serializer.Deserialize(fs);

    foreach (var item in objects.Items)
    {
        foreach (var prop in item.Properties)
        {
            Console.WriteLine(prop.Name   " "   prop.Value);
        }
        Console.WriteLine();
    }
}
 

Комментарии:

1. Я следовал приведенным выше советам, но все равно получаю исключение 1,40 > Исключение XmlException: имя не может начинаться с символа ‘.’, шестнадцатеричное значение 0x00. Строка 1, позиция 40.

2. @Asumuri — Этот код работает с вашим xml. Точка.

3. Я скопировал пример xml отсюда и получаю ту же ошибку. Я обнаружил, что это может быть связано с кодировкой, но не уверен, что нужно добавить

4. @Asumuri — Кодировка указана непосредственно в xml: utf-8. Сохраните файл в этой кодировке.

5. Когда я изменил кодировку на utf-16, все работало нормально, но что делать в коде или как переписать XML с точки зрения кода для чтения таких файлов