如何折叠空的xml标记
本文关键字:xml 标记 折叠 何折叠 | 更新日期: 2023-09-27 17:48:49
我得到的XML是这样的:
<Items>
<Row attr1="val"></Row>
<Row attr1="val2"></Row>
</Items>
正如您所知,这是有效的XML,但我正在使用的另一个库已损坏,它只接受以下格式的XML:
<Items>
<Row attr1="val"/>
<Row attr1="val2"/>
</Items>
我已经在将XML读取到XmlDocument中,对它们进行操作,并使用XmlWriter()重写它们,对我来说,"折叠"这些空标记最简单(也是最有效)的方法是什么?
将要折叠的每个XmlElement的IsEmpty属性设置为true。
如果使用System.XML的DOM操作对象(XmlElement等)而不是XmlWriter,则可以免费获得。
XmlElement items = xmlDoc.SelectNodes("items");
XmlElement row = xmlDoc.CreateElement("row");
items[0].appendChild(row);
您将得到一个"<row/>"
你可以试试这个。
具有WriteFullEndElement调用基的实现的XmlTextWriter子类。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();
发射CCD_ 3。
如果您的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);