0

タブ区切りファイルを読み取り、サンプルxmlファイルを作成するプログラムがあります。

\t\t\troot
\t\t\t\tnode1

出力:

<root><node1></node1></root>

プログラムのロジックを変更して、自動化の目的でxmldocumentを構築するc#のxmlではなくxmldocumentを構築する文字列表現を構築したいと思います。

たとえば(ドキュメントの実際のテキスト)

"XmlElement XElemRoot = xDoc.CreateElement("root");

XmlElement XElemSecond = xDoc.CreateElement("node1");

XElemRoot.AppendChild(XElemSecond);"

現在のコード:

 string[] files = System.IO.File.ReadAllLines(@"C:\dell\test\xmlsamplemaker\xmlsampler\xmlsampler\bin\Debug\textofxml.txt");
 string newXml = string.Empty;string[] xmlHolder;
 List<int> levels = new List<int>();
        var lastlevel = 0;

        Stack<String> stack = new Stack<String>();

        for (int lines = 0; lines < files.Length; lines++)  //start
        {
            var firstNode = files[lines].TrimEnd('\t');
            levels.Add(TextTool.CountStringOccurrences(firstNode, "\t"));  //first count
            if (lines == 0)
            {
                newXml += "<" + files[lines].Replace("\t", "") + ">" + System.Environment.NewLine;
                stack.Push(files[lines].Replace("\t", ""));
            }
            else{
                if (levels[levels.Count - 1] == levels[levels.Count - 2])
                {
                    newXml += "</" + stack.Pop() + ">" + System.Environment.NewLine;
                    newXml += "<" + files[lines].Replace("\t", "") + ">" +System.Environment.NewLine;
                    stack.Push(files[lines].Replace("\t", ""));
                }
                else if (levels[levels.Count - 1] > levels[levels.Count - 2])
                {
                    newXml += "<" + files[lines].Replace("\t", "") + ">" + System.Environment.NewLine;
                    stack.Push(files[lines].Replace("\t", ""));
                }
                else
                {
                    newXml += "</" + stack.Pop() + ">" + System.Environment.NewLine;
                    newXml += "</" + stack.Pop() + ">" + System.Environment.NewLine;
                    newXml += "<" + files[lines].Replace("\t", "") + ">" + System.Environment.NewLine;
                    stack.Push(files[lines].Replace("\t", ""));
                }
            }
        }
        var size = stack.Count;
        for (int j = 0; j < size; j++)
        {
            newXml += "</" + stack.Pop() + ">" + System.Environment.NewLine;
        }

        System.IO.File.WriteAllText(@"C:\dell\xmlsample.xml", newXml);
4

1 に答える 1

1

-thenを使用することをお勧めしますXmlWriter

newXml += "<" + files[lines].Replace("\t", "") + ">" + System.Environment.NewLine;

になります

writer.WriteStartElement(files[lines].Replace("\t", "") );

newXml += "</" + stack.Pop() + ">" + System.Environment.NewLine;

になります

writer.WriteEndElement();

など-インスタンスはどこwriterにありますかXmlWriter。このようにして、開いている要素の名前をスタックに保持する必要がなくなることに注意してください。ライターが自動的に行います(そして、単純なカウンターを使用して、開いている要素の数を追跡できます)。

コードでを使用するXmlWriterと、ファイル、任意のストリーム、文字列(ここを参照)、またはXmlDocumentusingに直接移動できますXmlNodeWriter

アップデート

'elegant'を作成するC#コードを生成するにはXmlDocument、おそらくオーバーザトップ=ソリューションはXmlWriter、コードテキストを生成するカスタムを実装することです。のソースコードがXmlNodeWriter出発点として適しています。

それ以外の場合は、現在のコードの文字列連結を、C#コードを含む同様の文字列に置き換えます。

于 2013-02-26T19:35:22.573 に答える