如何折叠空的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);