我有一个的XmlWriter如下缩进程序创建的XML在C#
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.NewLineHandling = NewLineHandling.Entitize;
using (XmlWriter currentWriter = XmlWriter.Create(filePath, settings))
{
workingXmlDocument.WriteTo(currentWriter);
currentWriter.Flush();
} // using (XmlWriter xw = XmlWriter.Create(FilePath))
我已编程方式创建,我想用这个来写一个XML文档,并且它是书面方式就好了,但我有一个在循环中创建的元素块,它将所有这些元素放在一行上。如果您需要查看程序中的其他代码,请告诉我,我可以将它放在此处。即使它们不是完整的解决方案,我也欢迎任何想法。
更新 - 完整的方法,其中的问题是发生
private void XMLReaderUtil(string filePath)
{
XDocument workingXmlDocument;
using (XmlReader currentReader = XmlReader.Create(filePath))
{
workingXmlDocument = XDocument.Load(currentReader);
foreach (KeyValuePair<string, string> currentIteration in logDataRaw)
{
FileInfo currentEntry = new FileInfo(currentIteration.Value);
string testString = currentEntry.Directory.Name;
if (testString.Contains(" ")) { testString = testString.Replace(" ", "_"); }
IEnumerable<XElement> list = from XElement e in workingXmlDocument.Descendants(wixNS + testString)
select e;
DirectoryInfo temp = currentEntry.Directory;
while (list.Count() == 0 && !temp.Name.Contains(":"))
{
testString = temp.Name;
if (testString.Contains(" ")) { testString = testString.Replace(" ", "_"); }
list = from XElement e in workingXmlDocument.Descendants(wixNS + testString)
select e;
temp = temp.Parent;
} // while (list.Count() == 0 && !temp.Name.Contains(":"))
if (list.Count() == 0)
{
IEnumerable<XElement> targetDirectory =
from XElement e in workingXmlDocument.Descendants(wixNS + "Directory")
where e.Attribute("Id").Value == "TARGETDIR"
select e;
var outXml = new XElement("root");
foreach (var item in targetDirectory)
{
item.Add(new XElement(
"Directory",
new XAttribute("new", 1)));
outXml.Add(item);
}
outXml.Save(@"c:\users\adkins\desktop\temp.wxs", SaveOptions.None);
}
} // foreach (KeyValuePair<string, string> kvp in xmlDataChanged)
// return workingXmlDocument;
} // using (XmlReader sr = XmlReader.Create(FilePath))
IEnumerable<XElement> cleanup =
from XElement e in workingXmlDocument.Descendants(wixNS + "Directory")
select e;
Collection<string> keep = new Collection<string>();
XElement[] blah;
blah = cleanup.ToArray();
for (int i = 0; i < blah.Length; i++)
{
if (!keep.Contains(blah[i].Attribute("Id").Value))
{
keep.Add(blah[i].Attribute("Id").Value);
}
else
{
blah[i].Remove();
}
}
workingXmlDocument.Save(filePath, SaveOptions.None);
// XMLWriter attempt
//XmlWriterSettings settings = new XmlWriterSettings();
//settings.Indent = true;
//settings.IndentChars = "\t";
//settings.NewLineHandling = NewLineHandling.Entitize;
//settings.NewLineChars = "\n";
//settings.CloseOutput = true;
//settings.Encoding = System.Text.Encoding.UTF8;
//using (XmlWriter currentWriter = XmlWriter.Create(filePath, settings))
//{
// workingXmlDocument.WriteTo(currentWriter);
// currentWriter.Flush();
//} // using (XmlWriter xw = XmlWriter.Create(FilePath))
//TextWriter test run - nothing changed
//XmlTextWriter writer = new XmlTextWriter(filePath, System.Text.Encoding.UTF8);
//writer.Formatting = Formatting.Indented;
//writer.IndentChar = '\t';
//writer.Indentation = 1;
//workingXmlDocument.WriteTo(writer);
//writer.Flush();
//writer.Close();
}
下面是完整的问题的方法。它包括我尝试以各种形式保存文件。由于我努力解决这个问题和我在遇到这个问题之前遇到的问题,这是一个完全的混乱。任何帮助将不胜感激!
变量“logDataRaw”是一个字典,其中包含文件的名称和存储位置的路径。如果您需要任何其他澄清,请让我知道。
是的,请发表你的代码,使这个“我有一个循环创建的元素块,它将所有这些元素放在一条线上” – Restuta 2010-01-27 15:04:02
所以它的一部分显示正确,部分是不?通常为了修复我的XML缩进,我真的把它加载到VS中,然后点击格式全部按钮。话虽如此,如果XML将被计算机读取,您可以通过删除空格来保存字节。 – 2010-01-27 15:08:05
旁白:你应该确保你设置'XmlWriterSettings.CloseOutput'到TRUE;这样,当作家配置,关闭文件。 – 2010-01-27 15:09:08