【问题标题】:How do I collapse empty xml tags?如何折叠空的 xml 标签?
【发布时间】:2008-10-13 17:51:33
【问题描述】:

我得到这样的 XML:

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

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

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

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

【问题讨论】:

    标签: c# xml


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      你会得到一个“

      【讨论】:

        【解决方案3】:

        你可以试试这个。

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

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

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

        【讨论】:

          【解决方案4】:

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

          发射&lt;foo bar='baz' /&gt;

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

          【讨论】:

            【解决方案5】:

            这是一个递归方法:

            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);
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2014-02-25
              • 1970-01-01
              • 1970-01-01
              • 2016-11-19
              • 2011-11-01
              • 1970-01-01
              • 2012-12-30
              相关资源
              最近更新 更多