Render Empty XML Elements as Parent Elements

后端 未结 3 638
悲&欢浪女
悲&欢浪女 2021-01-23 17:39

I have a strange requirement where an application consuming some XML that my application is generating actually needs empty elements to be serialized as parent elements. For exa

相关标签:
3条回答
  • 2021-01-23 17:47

    Scott Hanselman wrote a while back an article about stripping out empty elements from XML, and at a glance the code can be used for your purpose with a small alteration to the treatment of empty elements. He also explains why using RegEx is a bad idea.

    I am pointing this out, as I don't know of a way to get XmlSerializer to do what you want.

    Another possibility, though I don't really know much about WPF is using the XAML serializer - look at the System.Window.Markup namespace documentation.

    0 讨论(0)
  • 2021-01-23 18:02

    I extended XmlTextWriter so that I could override the WriteEndElement() method, forcing it to call WriteFullEndElement(). This did the trick.

    Note: for anybody that saw my question update, please ignore. IE was rendering the XML in the shorthand form. As soon as I opened it in Notepad, I realized everything was working fine.

    public class FullEndingXmlTextWriter : XmlTextWriter
    {
        public FullEndingXmlTextWriter(TextWriter w)
            : base(w)
        {
        }
    
        public FullEndingXmlTextWriter(Stream w, Encoding encoding)
            : base(w, encoding)
        {
        }
    
        public FullEndingXmlTextWriter(string fileName, Encoding encoding)
            : base(fileName, encoding)
        {
        }
    
        public override void WriteEndElement()
        {
            this.WriteFullEndElement();
        }
    }
    0 讨论(0)
  • 2021-01-23 18:07

    You could solve it with a regular expression, making it a two-pass process.

    string xml = "element foo=\"bar\" />"
    
    string pattern = @"<(?<elem>\w+)(?<body>\b.*)/>";
    string substitute =  @"<${elem} ${body}></${elem}>";
    
    Regex regex = new Regex(pattern);
    string goodresult = regex.Replace(xml, substitute);
    
    0 讨论(0)
提交回复
热议问题