2012-04-06 21 views
8

我正在使用XmlWriterSettings將Xml寫入文件。我有隻有屬性的元素,沒有孩子。我希望他們能夠作爲輸出:的指導XmlWriterSettings使用自閉標籤

<element a="1" /> 

代替

<element a="1"></element> 

我可以XmlWriterSettings辦呢?

編輯:

代碼如下:

private void Mission_Save(string fileName) 
    { 
     StreamWriter streamWriter = new StreamWriter(fileName, false); 
     streamWriter.Write(Mission_ToXml()); 
     streamWriter.Close(); 
     streamWriter.Dispose(); 

     _MissionFilePath = fileName; 
    } 

private string Mission_ToXml() 
    { 
     XmlDocument xDoc; 
     XmlElement root; 
     XmlAttribute xAtt; 

     xDoc = new XmlDocument(); 

     foreach (string item in _MissionCommentsBefore) 
      xDoc.AppendChild(xDoc.CreateComment(item)); 

     root = xDoc.CreateElement("mission_data"); 
     xAtt = xDoc.CreateAttribute("version"); 
     xAtt.Value = "1.61"; 
     root.Attributes.Append(xAtt); 
     xDoc.AppendChild(root); 

     //Out the xml's! 
     foreach (TreeNode node in _FM_tve_Mission.Nodes) 
      Mission_ToXml_private_RecursivelyOut(root, xDoc, node); 

     foreach (string item in _MissionCommentsAfter) 
      xDoc.AppendChild(xDoc.CreateComment(item)); 


     //Make this look good 
     StringBuilder sb = new StringBuilder(); 
     XmlWriterSettings settings = new XmlWriterSettings(); 

     settings.Indent = true; 
     settings.IndentChars = " "; 
     settings.NewLineChars = "\r\n"; 
     settings.NewLineHandling = NewLineHandling.Replace; 
     settings.OmitXmlDeclaration = true; 
     using (XmlWriter writer = XmlWriter.Create(sb, settings)) 
     { 
      xDoc.Save(writer); 
     } 

     return sb.ToString(); 
    } 

private void Mission_ToXml_private_RecursivelyOut(XmlNode root, XmlDocument xDoc, TreeNode tNode) 
    { 
     root.AppendChild(((MissionNode)tNode.Tag).ToXml(xDoc)); 
     foreach (TreeNode node in tNode.Nodes) 
      Mission_ToXml_private_RecursivelyOut(root, xDoc, node); 
    } 

這裏_FM_tve_Mission是具有節點,每個節點具有類MissionNode的標籤,其具有toxml用於方法返回XmlNode的一個TreeView控制含有這種MissionNode轉換爲XML

+0

你的代碼是什麼?一個[沒有特定設置的XmlWriter](http://ideone.com/g158S)以你想要的方式寫入他們 – 2012-04-06 19:03:28

回答

8

你不需要爲任何特殊設置:

XmlWriter output = XmlWriter.Create(filepath); 
output.writeStartElement("element"); 
output.writeAttributeString("a", "1"); 
output.writeEndElement(); 

這會給你的<element a="1" />輸出(只是測試它在我正在寫XML的應用程序)

基本上,如果你不添加任何數據你寫的結束元素之前它只是關閉它關閉你。

我也有以下XmlWriterSettings它可能是其中之一,如果它不是由默認的工作:從外部文件

XmlWriterSettings wSettings = new XmlWriterSettings(); 
wSettings.Indent = true; 
wSettings.ConformanceLevel = ConformanceLevel.Fragment; 
wSettings.OmitXmlDeclaration = true; 
XmlWriter output = XmlWriter.Create(filePathXml, wSettings); 
+0

不,不,你不明白。我有非常複雜的XML,實際上它是一個遊戲的任務編輯器,它以xml格式存儲場景(腳本和事件以及其他東西),所以它是動態生成的,我想用xmlwriter通過執行XmlWriter來輸出它。寫(myXml) – Istrebitel 2012-04-06 19:12:10

+0

XmlWriter只有一個靜態的'Create'方法。你不能調用'XmlWriter.Write()',因爲它不存在。您必須單獨爲每個節點寫入名稱和屬性。從你給出的解釋正是你想要的。你不能將數據神奇地傳遞給xmlwriter並期待輸出。你必須告訴它輸出什麼元素和屬性。 – jzworkman 2012-04-06 19:15:03

+0

對不起,我錯了,它叫Save not Write ....我的意思是使用XmlDocument類型的方法保存(傳遞XmlWriter對象)的對象,我將代碼添加到OP – Istrebitel 2012-04-06 19:18:34

1

處理XML,我寫了下面的類來擺脫非空閉的元素。我的XML現在有自我關閉的標籤。

using System.Linq; 
using System.Xml.Linq; 

namespace XmlBeautifier 
{ 
    public class XmlBeautifier 
    { 
     public static string BeautifyXml(string outerXml) 
     { 
      var _elementOriginalXml = XElement.Parse(outerXml); 
      var _beautifiedXml = CloneElement(_elementOriginalXml); 
      return _beautifiedXml.ToString(); 
     } 

     public static XElement CloneElement(XElement element) 
     { 
      // http://blogs.msdn.com/b/ericwhite/archive/2009/07/08/empty-elements-and-self-closing-tags.aspx 
      return new XElement(element.Name, 
       element.Attributes(), 
       element.Nodes().Select(n => 
       { 
        XElement e = n as XElement; 
        if (e != null) 
         return CloneElement(e); 
        return n; 
       }) 
      ); 
     } 

    } 
} 
0

用正則表達式和遞歸的方法,很容易的工作:

using System.Xml.Linq; 
    public static class Xml 
    { 
     /// <summary> 
     /// Recursive method to shorten all xml end tags starting from a given element, and running through all sub elements 
     /// </summary> 
     /// <param name="elem">Starting point element</param> 
     public static void ToShortEndTags(this XElement elem) 
     { 
      if (elem == null) return; 

      if (elem.HasElements) 
      { 
       foreach (var item in elem.Elements()) ToShortEndTags(item); 
       return; 
      } 

      var reduced = Regex.Replace(elem.ToString(), ">[\\s\\n\\r]*</\\w+>", "/>"); 

      elem.ReplaceWith(XElement.Parse(reduced)); 
     } 
    } 

,並使用它,類型是這樣的:

var path = @"C:\SomeFile.xml"; 
    var xdoc = XDocument.Load(path).Root.ToShortEndTags(); 

xdoc現在的XDocument實例從給定的路徑加載,但其全部符合條件(不含內容)全部結束標籤現在是短ened