Создание XmlDocument с жестко заданной схемой C#

У меня есть приложение, которое работает с файлом XML. Он отлично работает, если файл xml присутствует, однако также существует требование, чтобы проект создавал пустой файл XML, а затем записывался в него, если выходной файл отсутствует.

Файл xml имеет довольно сложную схему, примерно такую:

<?xml version="1.0" encoding="UTF-8"?>
<Results>
    <Result>
        <WorkorderId>45</WorkorderId>
        <WorkerId>13</WorkerId>
        <DeviceId>38954178</DeviceId>
        <Latitude>45.234</Latitude>
        <Longitude>19.54</Longitude>
        <Note>[all is good]</Note>
        <Operations>
            <Operation>
                <OperationId>23</OperationId>
                <Result>Success</Result>
                <ParsedInformation>
                    <Info>parsed data</Info>
                    <Info>more parsed data</Info>
                </ParsedInformation>
            </Operation>
            <!-- more operations ... -->
        </Operations>
    </Result>
    <!-- more results ... -->
</Results>

Мне интересно, как мне создать такой XmlDocument, чтобы я мог записать в него результаты? Есть ли «лучшая практика» жесткого кодирования схемы где-то в проекте и т. д.?

Обратите внимание, что я новичок в Xml, поэтому любая дополнительная информация/литература будет очень кстати.


person David Božjak    schedule 28.07.2009    source источник


Ответы (3)


Насколько мне известно, вы должны строить документ узел за узлом. Возможно, вы можете сохранить пустое дерево в качестве шаблона.

person dbd    schedule 28.07.2009

Обычно я создавал набор классов, содержащих данные, и помечал их соответствующими атрибутами XmlSerializer, чтобы убедиться, что они сериализуются в ожидаемом формате. Это довольно хороший ресурс: http://msdn.microsoft.com/en-us/library/2baksw0z(VS.85).aspx

В вашем случае у вас будут следующие классы (непроверенные):

[XmlRoot("Results")]
public class Results
{
  List<Result> results = new List<Result>();

  [XmlElement("Result")]
  List<Result> Results {get{return results;}}
}

public class Result
{
  List<Operation> operations = new List<Operation>();
  int WorkorderId {get; set;}
  .... other fields
  string Note{get;set;}
  List<Operation> Operations {get{return operations;}}
}

public class Operation
{
  List<string> parsedInformation = new List<string>();
  int OperationId {get;set;}
  ....
  [XmlArray("ParsedInformation")]
  [XmlArrayItem("Info")]
  List<string> ParsedInformation{get{return parsedInformation;}}
}

Позже вы используете класс XmlSerializer для его сериализации в xml:

XmlSerializer serializer = new XmlSerializer(typeof(Results));
StringBuilder sb = new StringBuilder(); //this will contain the xml
serializer.Serialize(new TextWriter(sb), resultsObj);

Очевидно, вы также можете десериализовать данные из строки в объект.

Обратите внимание, что если у вас есть схема XSD для вашего xml, вы можете использовать инструмент xsd.exe для создания кода для вас.

person Grzenio    schedule 28.07.2009

Если у вас действительно есть XML-схема для вашего формата документа, вы можете использовать утилиту xsd.exe для создания для нее группы XmlSerializer-совместимых классов — элементы становятся классами, их атрибуты и дочерние элементы становятся свойствами, последовательности элементов становятся коллекциями и т. д. . Вы также получите правильные типы, если они определены вашей схемой (т. е. xs:int становится int и т. д.). Затем вы можете построить дерево объектов в памяти, используя эти классы, и сериализовать его, используя XmlSerializer.

person Pavel Minaev    schedule 28.07.2009