2010-01-27 58 views
1

我有一个的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”是一个字典,其中包含文件的名称和存储位置的路径。如果您需要任何其他澄清,请让我知道。

+0

是的,请发表你的代码,使这个“我有一个循环创建的元素块,它将所有这些元素放在一条线上” – Restuta 2010-01-27 15:04:02

+0

所以它的一部分显示正确,部分是不?通常为了修复我的XML缩进,我真的把它加载到VS中,然后点击格式全部按钮。话虽如此,如果XML将被计算机读取,您可以通过删除空格来保存字节。 – 2010-01-27 15:08:05

+1

旁白:你应该确保你设置'XmlWriterSettings.CloseOutput'到TRUE;这样,当作家配置,关闭文件。 – 2010-01-27 15:09:08

回答

2

的问题是,我是通过加载一个XMLReader XML文件。一旦我删除它,只是直接加载到我的XDocument比一切工作正常。

+0

它有多奇怪!我得到了同样的问题,你是对的...我不能相信它的XmlReader影响XmlWriter ... – Ricky 2011-12-15 07:08:08

1

为什么不直接使用XElement.Save()而不是XmlWriter?

http://msdn.microsoft.com/en-us/library/bb538458.aspx

编辑:

我只是跑的代码

 var xml = new XElement("root", 
           new XElement("node", 
              new XAttribute("index", 1) 
           ), 
           new XElement("node", 
              new XAttribute("index", 2) 
           ), 
           new XElement("node", 
              new XAttribute("index", 3) 
           ), 
           new XElement("node", 
              new XAttribute("index", 4) 
           ) 
      ); 

     IEnumerable<XElement> ieXml = 
      from XElement e in xml.Elements() 
      select e; 

     var outXml = new XElement("root"); 
     foreach (var item in ieXml) 
     { 
      item.Add(new XElement(
       "Directory", 
       new XAttribute("new", 1))); 

      outXml.Add(item); 
     } 


     outXml.Save(@"d:\foo.xml", SaveOptions.None); 

下位,结果被格式化

<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <node index="1"> 
    <Directory new="1" /> 
    </node> 
    <node index="2"> 
    <Directory new="1" /> 
    </node> 
    <node index="3"> 
    <Directory new="1" /> 
    </node> 
    <node index="4"> 
    <Directory new="1" /> 
    </node> 
</root> 

我不知道你的”重新做不同的事情,但这是有效的。

+0

@Chad:我相信OP想要序列化整个文档,而不仅仅是一个元素。所以,我建议你改用'XDocument.Save()'来代替。虽然我怀疑只是在引擎盖下使用'XmlWriter'。 – 2010-01-27 15:13:31

+0

@Chad:我试着用XDocument代替XElement,但得到了相同的输出。 – Adkins 2010-01-27 15:14:21

+1

@Jeff,你正在使用的保存选项是什么? http://msdn.microsoft.com/en-us/library/system.xml.linq.saveoptions.aspx 因为它应该保持它 – CaffGeek 2010-01-27 15:15:53

0

你可能只需要使用默认的编码,而不是XmlWriter的一个XmlTextWriter和Writer对象的格式属性设置为Formatting.Indented

+0

我试过了。我更新了我的代码以显示我所有尝试保存的内容。 – Adkins 2010-01-28 08:29:31

0

如果有人使用的XDocument,仍然有拯救XML具有正确的缩进,这可以帮助你的文件的问题,它确实对我来说:

  1. 除了乍得的答案,我不得不使用XName.Get( ...)指定时的XElement名称:

    var xdoc = new XDocument(
          new XDeclaration("1.0", "utf-8", "yes"), 
          new XElement(XName.Get("TranslationContainer"), 
             new XElement(XName.Get("Translations")))); 
    
  2. 检查你有一个格式良好的XML(没有XML标签外文本)

祝你好运。