Я занимаюсь разработкой системы для получения вложений XML из электронных писем через веб-службы Exchange и ввода их в базу данных с помощью созданного мной пользовательского объекта DAL.
Мне удалось извлечь XML-вложение и подготовить его в виде потока ... они задаются вопросом, как проанализировать этот поток и заполнить объект DAL.
Я могу создать XMLTextReader и перебирать каждый элемент. Я не вижу никаких проблем с этим, кроме того, что я подозреваю, что есть намного более гладкий путь. Читатель, похоже, рассматривает открывающий тег, содержимое тега и закрывающий тег как разные элементы (используя reader.NodeType). Я ожидал, что myValue будет считаться одним элементом, а не тремя. Как я уже сказал, я могу обойти эту проблему, но я уверен, что должен быть лучший способ.
Мне пришла в голову идея использовать XML Serializer (совершенно новый для меня), но быстрый взгляд показал, что они не могут обрабатывать ArrayLists и List (я использую List).
Опять же, я новичок в LINQ, но LINQ-to-XML также упоминался, но примеры, которые я видел, кажутся довольно сложными, хотя это просто мое отсутствие знакомства.
По сути, я не хочу использовать систему с кластерами, но я не хочу использовать какую-либо сложную технику с кривой обучения, просто потому, что она «крутая».
Какой самый простой и эффективный способ преобразования этого XML / Stream в мои объекты DAL?
Пример XML:
<?xml version="1.0" encoding="UTF-8"?>
<enquiry>
<enquiryno>100001</enquiryno>
<companyname>myco</companyname>
<typeofbusiness>dunno</typeofbusiness>
<companyregno>ABC123</companyregno>
<postcode>12345</postcode>
<contactemail>me@example.com</contactemail>
<firstname>My</firstname>
<lastname>Name</lastname>
<vehicles>
<vehicle>
<vehiclereg>54321</vehiclereg>
<vehicletype>Car</vehicletype>
<vehiclemake>Ford</vehiclemake>
<cabtype>n/a</cabtype>
<powerbhp>130</powerbhp>
<registrationdate>01/01/2003</registrationdate>
</vehicle>
</vehicles>
</enquiry>
Обновление 1 :
Я пытаюсь десериализовать, основываясь на примере Грэма. Я думаю Я настроил DAL для сериализации, включая указание [XmlElement("whatever")]
для каждого свойства. И я попытался десериализовать, используя следующее:
SalesEnquiry enquiry = null;
XmlSerializer serializer = new XmlSerializer(typeof(SalesEnquiry));
enquiry = (SalesEnquiry)serializer.Deserialize(stream);
Однако я получаю исключение: 'There is an error in XML document (2, 2)
'. Состояния невосприятия {"<enquiry xmlns=''> was not expected."}
Вывод (обновлено):
Моя предыдущая проблема заключалась в том, что элемент в XML-файле (Inquiry)! = Имя класса (SalesEnquiry). Вместо атрибута [XmlElement]
для класса нам нужен атрибут [XmlRoot]
. Для полноты, если вы хотите, чтобы свойство в вашем классе игнорировалось во время сериализации, используйте атрибут [XmlIgnore]
.
Я успешно сериализовал свой объект, и теперь успешно принял входящий XML и десериализовал его в объект SalesEnquiry.
Этот подход намного проще, чем ручной анализ XML. Хорошо, крутой курс обучения был, но оно того стоило.
Спасибо!