Dealing with invalid XML hexadecimal characters

后端 未结 8 552
不知归路
不知归路 2020-12-05 11:10

I\'m trying to send an XML document over the wire but receiving the following exception:

\"MY LONG EMAIL STRING\" was specified for the \'Body\' element. ---         


        
8条回答
  •  情书的邮戳
    2020-12-05 11:22

    There is a generic solution that works nicely:

    public class XmlTextTransformWriter : System.Xml.XmlTextWriter
    {
        public XmlTextTransformWriter(System.IO.TextWriter w) : base(w) { }
        public XmlTextTransformWriter(string filename, System.Text.Encoding encoding) : base(filename, encoding) { }
        public XmlTextTransformWriter(System.IO.Stream w, System.Text.Encoding encoding) : base(w, encoding) { }
    
        public Func TextTransform = s => s;
    
        public override void WriteString(string text)
        {
            base.WriteString(TextTransform(text));
        }
    
        public override void WriteCData(string text)
        {
            base.WriteCData(TextTransform(text));
        }
    
        public override void WriteComment(string text)
        {
            base.WriteComment(TextTransform(text));
        }
    
        public override void WriteRaw(string data)
        {
            base.WriteRaw(TextTransform(data));
        }
    
        public override void WriteValue(string value)
        {
            base.WriteValue(TextTransform(value));
        }
    }
    

    Once this is in place, you can then create your override of THIS as follows:

    public class XmlRemoveInvalidCharacterWriter : XmlTextTransformWriter
    {
        public XmlRemoveInvalidCharacterWriter(System.IO.TextWriter w) : base(w) { SetTransform(); }
        public XmlRemoveInvalidCharacterWriter(string filename, System.Text.Encoding encoding) : base(filename, encoding) { SetTransform(); }
        public XmlRemoveInvalidCharacterWriter(System.IO.Stream w, System.Text.Encoding encoding) : base(w, encoding) { SetTransform(); }
    
        void SetTransform()
        {
            TextTransform = XmlUtil.RemoveInvalidXmlChars;
        }
    }
    

    where XmlUtil.RemoveInvalidXmlChars is defined as follows:

        public static string RemoveInvalidXmlChars(string content)
        {
            if (content.Any(ch => !System.Xml.XmlConvert.IsXmlChar(ch)))
                return new string(content.Where(ch => System.Xml.XmlConvert.IsXmlChar(ch)).ToArray());
            else
                return content;
        }
    

提交回复
热议问题