Каков наилучший способ создания файла XML, если все теги (включая закрывающие теги) и их значения поступают из БД?

У меня есть ситуация, когда мне нужно сгенерировать некоторые XML-файлы на основе данных, поступающих из БД. Структура данных, которые хранятся в БД, является проблемой. На самом деле все теги и их значения хранятся в таблице, которая также включает закрывающие теги.

Например, рассмотрим следующий XML, который будет создан:

<x>
    <y>
        <a>cc</a>
        <b></b>
    </y>
    <y>
        <a>oo</a>
        <b>kk</b>
    </y>
</x>

Теперь данные этого XML хранятся в БД следующим образом:

IS_CONTAINER    TAG_NAME    TAG_VALUE
------------    --------    ---------
1               x           NULL
1               y           NULL
0               a           cc
0               b           NULL
1               /y          NULL
1               y           NULL
0               a           oo
0               b           kk
1               /y          NULL
1               /x          NULL

Вот IS_CONTAINER = 1 означает, что тег содержит дочерние элементы и его закрывающий тег находится в записях. Такие как x & y, В то время как IS_CONTAINER = 0 означает, что это отдельный элемент XML без подэлементов, поэтому мне придется закрывать / добавлять закрывающий тег после установки его значения. такие как a & b,

Я полагаю, я не могу использовать XmlTextWriter как мне придется явно назвать его WriteStartElement & WriteEndElement методы каждый раз. Это станет излишне сложным, так как мне придется отслеживать, какие элементы начинаются с "\", что будет означать, что я должен закрыть какой-то ранее открытый элемент.

Я мог бы использовать TextWriter записывать данные в файл при чтении каждой строки и просто добавлять символы "<" & ">" к каждому TAG_NAME перед записью в текстовый файл, но это также будет означать, что мне придется написать <?xml version="1.0" encoding="iso-8859-1" standalone="yes"?> я как самая первая строка файла. все будет сделано вручную.

Я надеюсь, что вы знаете, в чем проблема.

Ребята, можете ли вы порекомендовать мне какой-нибудь хороший способ?

2 ответа

Решение

Суть вашей проблемы заключается в создании лучшего алгоритма для извлечения информации из БД наиболее эффективным способом. В принципе, кажется, лучше полагаться на XmlWriter, но с правильным алгоритмом другие альтернативы также могут быть в порядке.

Образец кода:

System.Xml.XmlWriterSettings settings = new System.Xml.XmlWriterSettings();
settings.NewLineOnAttributes = false;
settings.Indent = true;
using (System.Xml.XmlWriter writer = System.Xml.XmlWriter.Create("output.xml", settings))
{
    writer.WriteStartDocument();

    int[] IS_CONTAINER = new int[] { 1, 1, 0, 0, 1, 1 };
    string[] TAG_NAME = new string[]{ "x", "y", "a", "b", "/y", "/x"};
    string[] TAG_VALUE = new string[]{ null, null, "cc", "kk", "/y", "/x"};

    for (int i = 0; i <= TAG_NAME.Length - 1; i++)
    {
        if (!TAG_NAME[i].Contains("/"))
        {
            writer.WriteStartElement(TAG_NAME[i]);
            if(TAG_VALUE[i] != null) writer.WriteValue(TAG_VALUE[i]);
        }

        if(IS_CONTAINER[i] == 0 || TAG_NAME.Contains("/")) writer.WriteEndElement();
    }

    writer.WriteEndDocument();
}

Обратите внимание, что этот алгоритм предполагает, что информация БД всегда верна и, следовательно, нет необходимости отслеживать открытые узлы (когда появляется закрывающий тег, узел должен быть закрыт, потому что он обязательно открыт). Если вы не хотите слепо доверять правильности информации БД, вам придется отслеживать открытые теги.

Класс XmlWriter

var writerSettings = new XmlWriterSettings();
writerSettings.Indent = true;

XmlWriter writer = XmlWriter.Create("d:\\MyFirstXmlFile.xml", writerSettings);

writer.WriteStartDocument();
writer.WriteStartElement("People");

writer.WriteStartElement("Person");
writer.WriteElementString("Name", "Zain Shaikh");
writer.WriteElementString("JobDescription", "Software Engineer");
writer.WriteElementString("Facebook", "http://www.facebook.com/zainshaikh");
writer.WriteEndElement();

writer.WriteEndElement();
writer.WriteEndDocument();

writer.Flush();
Другие вопросы по тегам