#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 с точки зрения кода для чтения таких файлов