如果所有标签(包括结束标签)及其值都来自数据库,那么生成XML文件的最佳方法是什么?

时间:2013-12-26 11:17:40

标签: c# xml xmltextwriter textwriter xml-generation

我有一种情况,我必须根据来自数据库的数据生成一些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&amp; y。其中IS_CONTAINER = 0表示它是一个没有子元素的单个XML元素,因此我必须在设置其值后关闭/追加其结束TAG。例如a&amp; b

我想我无法使用XmlTextWriter,因为我必须明确地将其称为WriteStartElement&amp;每次都有WriteEndElement个方法。它将变得不必要地复杂,因为我必须跟踪哪些元素以“\”开头,这意味着我必须关闭一些先前打开的元素。

我可以使用TextWriter将数据写入文件,因为每行都被读取,只需附加“&lt;” &安培; “&gt;” 中在写入文本文件之前每个TAG_NAME的字符,但这也意味着我必须自己编写<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>作为文件的第一行。一切都将手动完成。

我希望你知道这是什么问题。

如果我遗失了什么,你们可以向我推荐一些好方法吗?

2 个答案:

答案 0 :(得分:1)

问题的关键在于构建最佳算法,以最有效的方式提取数据库信息。原则上,依靠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();
}

请注意,此算法假定数据库信息始终正确,因此不需要跟踪打开的节点(每当出现结束标记时,必须关闭节点,因为它肯定是打开的)。如果不想盲目地信任DB信息的正确性,您必须跟踪打开的标签。

答案 1 :(得分:-1)

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();