Каков наилучший способ создания файла 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();