0

我有一个程序可以读取制表符分隔的文件并构建一个示例 xml 文件。

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

输出:

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

我想更改程序的逻辑以构建构建 xmldocument 的字符串表示形式,而不是 c# 构建 xmldocument 以实现自动化目的的 xml

例如(文档的实际文本)

"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

我建议使用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

更新

要生成创建XmlDocument“优雅”的 C# 代码 - 但可能是过度的 = 解决方案是实现XmlWriter生成代码文本的自定义。的源代码XmlNodeWriter将是一个很好的起点。

否则,只需将当前代码的字符串连接替换为包含 C# 代码的类似字符串...

于 2013-02-26T19:35:22.573 回答