[英]whats the best way to generate an XML file if all tags (including closing tags) and their values come from DB?
在這種情況下,我必須根據來自DB的數據生成一些XML文件。 問題是存儲在DB中的數據的結構。 實際上,所有TAG及其值都存儲在一個表中,該表也包括關閉TAG。
例如,考慮將要生成的以下XML:
<x>
<y>
<a>cc</a>
<b></b>
</y>
<y>
<a>oo</a>
<b>kk</b>
</y>
</x>
現在,此XML的數據存儲在DB中,如下所示:
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
表示TAG包含子項,並且其結束標記即將出現在記錄中。 如x
& y
。 IS_CONTAINER = 0
意味着它是一個沒有子元素的單個XML元素,因此我必須在設置其值后關閉/附加其關閉TAG。 例如a
& b
。
我想我不能使用XmlTextWriter
因為每次都必須顯式調用它的WriteStartElement
和WriteEndElement
方法。 它將變得不必要地復雜,因為我必須跟蹤哪些元素以“ \\”開頭,這意味着我必須關閉一些先前打開的元素。
我可以使用TextWriter
在讀取每一行時將數據寫入文件,並在寫入文本文件之前僅在每個TAG_NAME
附加“ <”和“>”字符,但這也意味着我必須寫入<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>
我自己是文件的第一行。 一切將手動完成。
希望您知道問題所在。
你們能推薦我一些好方法嗎?
問題的全部重點是構建最佳算法,以最有效的方式提取數據庫信息。 原則上,依賴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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.