0

我有一种情况,我必须根据来自 DB 的数据生成一些 XML 文件。存储在数据库中的数据结构是问题所在。实际上,所有 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意味着标签包含子标签,并且它的结束标签出现在记录中。比如x& y。这IS_CONTAINER = 0意味着它是一个没有子元素的单个 XML 元素,所以我必须在设置它的值后关闭/附加它的关闭标签。比如a& b

我想我不能使用,因为我每次XmlTextWriter都必须显式调用它的WriteStartElement&方法。WriteEndElement它会变得不必要的复杂,因为我必须跟踪哪些元素以“\”开头,这意味着我必须关闭一些以前打开的元素。

我可以TextWriter在读取每一行时将数据写入文件,然后在写入文本文件之前将“<”和“>”字符附加到每个TAG_NAME文件中,但这也意味着我必须将<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>自己写为第一个文件的行。一切都将手动完成。

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

如果我遗漏了什么,你们能推荐我一些好的方法吗?

4

2 回答 2

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 信息始终正确,因此不需要跟踪打开的节点(每当出现关闭标记时,必须关闭节点,因为它肯定是打开的)。如果不想盲目地相信数据库信息的正确性,则必须跟踪打开的标签。

于 2013-12-26T11:41:18.780 回答
-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();
于 2013-12-26T11:24:09.230 回答