如何折叠空的xml标签?

我得到这样的XML:

如您所知,这是有效的XML,但我正在使用的另一个库已被破坏,它只接受以下格式的XML:

我已经将XML读入XmlDocuments,操纵它们,并使用XmlWriter()重写它们,我最简单(也是最有效)的方法是“折叠”这些空标记?

将要折叠的每个XmlElement的IsEmpty属性设置为true。

如果你使用System.XML的DOM操作对象(XmlElement等)而不是XmlWriter,你可以免费获得它。

 XmlElement items = xmlDoc.SelectNodes("items"); XmlElement row = xmlDoc.CreateElement("row"); items[0].appendChild(row); 

你会得到一个“

你可以试试这个。

子类XmlTextWriter,其实现的WriteFullEndElement调用base.WriteEndElement。 像这样:

  public class BetterXmlTextWriter : XmlTextWriter { public BetterXmlTextWriter(TextWriter w) : base(w) { } public override void WriteFullEndElement() { base.WriteEndElement(); } } 

然后使用XmlDocument.WriteContentTo将文档写入子类的实例。

如果您已经在使用XmlWriter编写XML,那么它应该已经折叠了空元素。 此代码(使用.Net 3.5):

 XmlWriter xw = XmlWriter.Create(Console.Out); xw.WriteStartElement("foo"); xw.WriteAttributeString("bar", null, "baz"); xw.WriteEndElement(); xw.Flush(); xw.Close(); 

发出

如果你的XmlWriter不是,你应该检查以确保你的XmlWriter代码没有发出你不期望的文本节点。

这是一个递归方法:

 private static void FormatEmptyNodes(XmlNode rootNode) { foreach (XmlNode childNode in rootNode.ChildNodes) { FormatEmptyNodes(childNode); if(childNode is XmlElement) { XmlElement element = (XmlElement) childNode; if (string.IsNullOrEmpty(element.InnerText)) element.IsEmpty = true; } } } 

像这样使用:

 var doc = new XmlDocument(); doc.Load(inputFilePath); FormatEmptyNodes(doc); doc.Save(outputFilePath);