0

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これは、タグに子が含まれており、その終了タグがレコードに含まれていることを意味します。x&などy。asIS_CONTAINER = 0は、サブ要素のない単一の XML 要素であることを意味するため、値を設定した後、終了 TAG を閉じる/追加する必要があります。a&などb

毎回&メソッドXmlTextWriterを明示的に呼び出す必要があるため、使用できないと思います。どの要素が「\」で始まるかを追跡する必要があるため、不必要に複雑になります。これは、以前に開いた要素を閉じる必要があることを意味します。WriteStartElementWriteEndElement

すべての行が読み取られるときにデータをファイルに書き込むために使用でき、テキスト ファイルに書き込む前TextWriterにそれぞれに「<」と「>」の文字を追加するだけですが、最初の行として自分自身TAG_NAMEを書き込む必要があることも意味します。<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>ファイルの行。すべてが手動で行われます。

問題が何であるかを知っていただければ幸いです。

何か不足している場合は、何か良い方法を教えてください。

4

2 に答える 2

1

問題の要点は、DB 情報を最も効率的な方法で抽出するための最適なアルゴリズムを構築することです。原則として、 に依存する方がよいように思われます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 情報が常に正しいと想定しているため、開いているノードを追跡する必要がないことに注意してください (終了タグが表示されるたびに、ノードは確実に開かれているため、ノードを閉じる必要があります)。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 に答える