如何折叠空的xml标签?

时间:2008-10-13 17:51:34

标签: c# xml

我得到这样的XML:

<Items> <Row attr1="val"></Row> <Row attr1="val2"></Row> </Items>

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

<Items> <Row attr1="val"/> <Row attr1="val2"/> </Items>

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

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

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

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

你会得到一个“&lt; row /&gt;”

答案 2 :(得分:0)

你可以试试这个。

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

    public class BetterXmlTextWriter : XmlTextWriter
    {
        public BetterXmlTextWriter(TextWriter w)
            : base(w)
        {
        }

        public override void WriteFullEndElement()
        {
            base.WriteEndElement();
        }
    }

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

答案 3 :(得分:0)

如果您已经在使用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();

发出<foo bar='baz' />

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

答案 4 :(得分:0)

这是一个递归方法:

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);
相关问题