我有一种情况,我必须根据来自数据库的数据生成一些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"?>
作为文件的第一行。一切都将手动完成。
我希望你知道这是什么问题。
如果我遗失了什么,你们可以向我推荐一些好方法吗?
答案 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();