簡體   English   中英

如果所有標簽(包括結束標簽)及其值都來自DB,那么生成XML文件的最佳方法是什么?

[英]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包含子項,並且其結束標記即將出現在記錄中。 xy IS_CONTAINER = 0意味着它是一個沒有子元素的單個XML元素,因此我必須在設置其值后關閉/附加其關閉TAG。 例如ab

我想我不能使用XmlTextWriter因為每次都必須顯式調用它的WriteStartElementWriteEndElement方法。 它將變得不必要地復雜,因為我必須跟蹤哪些元素以“ \\”開頭,這意味着我必須關閉一些先前打開的元素。

我可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM