2 // WellFormedXmlWriter.cs
5 // Atsushi Enomoto <atsushi@ximian.com>
7 // Copyright (C) 2006 Novell, Inc. http://www.novell.com
10 using System
.Globalization
;
11 using System
.Collections
;
14 namespace CorCompare
{
16 public class WellFormedXmlWriter
: DefaultXmlWriter
18 public static bool IsValid (int ch
)
20 return !IsInvalid (ch
);
23 public static bool IsInvalid (int ch
)
47 public static int IndexOfInvalid (string s
, bool allowSurrogate
)
49 for (int i
= 0; i
< s
.Length
; i
++)
50 if (IsInvalid (s
[i
])) {
51 if (!allowSurrogate
||
55 s
[i
+ 1] < '\uDC00' ||
56 s
[i
+ 1] >= '\uE000')
63 public static int IndexOfInvalid (char [] s
, int start
, int length
, bool allowSurrogate
)
65 int end
= start
+ length
;
67 throw new ArgumentOutOfRangeException ("length");
68 for (int i
= start
; i
< end
; i
++)
69 if (IsInvalid (s
[i
])) {
70 if (!allowSurrogate
||
74 s
[i
+ 1] < '\uDC00' ||
75 s
[i
+ 1] >= '\uE000')
82 public WellFormedXmlWriter (XmlWriter writer
) : base (writer
)
86 public override void WriteString (string text
)
88 int i
= IndexOfInvalid (text
, true);
90 char [] arr
= text
.ToCharArray ();
91 Writer
.WriteChars (arr
, 0, i
);
92 WriteChars (arr
, i
, arr
.Length
- i
);
94 // no invalid character.
95 Writer
.WriteString (text
);
99 public override void WriteChars (char [] text
, int idx
, int length
)
102 int end
= idx
+ length
;
103 while ((idx
= IndexOfInvalid (text
, start
, length
, true)) >= 0) {
105 Writer
.WriteChars (text
, start
, idx
- start
);
106 Writer
.WriteString (String
.Format (CultureInfo
.InvariantCulture
,
107 text
[idx
] < 0x80 ? "\\x{0:X02}" : "\\u{0:X04}",
109 length
-= idx
- start
+ 1;
113 Writer
.WriteChars (text
, start
, end
- start
);
118 public class DefaultXmlWriter
: XmlWriter
122 public DefaultXmlWriter (XmlWriter writer
)
124 this.writer
= writer
;
127 protected XmlWriter Writer
{
128 get { return writer; }
131 public override void Close ()
136 public override void Flush ()
141 public override string LookupPrefix (string ns
)
143 return writer
.LookupPrefix (ns
);
146 public override void WriteBase64 (byte [] buffer
, int index
, int count
)
148 writer
.WriteBase64 (buffer
, index
, count
);
151 public override void WriteBinHex (byte [] buffer
, int index
, int count
)
153 writer
.WriteBinHex (buffer
, index
, count
);
156 public override void WriteCData (string text
)
158 writer
.WriteCData (text
);
161 public override void WriteCharEntity (char ch
)
163 writer
.WriteCharEntity (ch
);
166 public override void WriteChars (char [] buffer
, int index
, int count
)
168 writer
.WriteChars (buffer
, index
, count
);
171 public override void WriteComment (string text
)
173 writer
.WriteComment (text
);
176 public override void WriteDocType (string name
, string pubid
, string sysid
, string subset
)
178 writer
.WriteDocType (name
, pubid
, sysid
, subset
);
181 public override void WriteEndAttribute ()
183 writer
.WriteEndAttribute ();
186 public override void WriteEndDocument ()
188 writer
.WriteEndDocument ();
191 public override void WriteEndElement ()
193 writer
.WriteEndElement ();
196 public override void WriteEntityRef (string name
)
198 writer
.WriteEntityRef (name
);
201 public override void WriteFullEndElement ()
203 writer
.WriteFullEndElement ();
206 public override void WriteName (string name
)
208 writer
.WriteName (name
);
211 public override void WriteNmToken (string name
)
213 writer
.WriteNmToken (name
);
216 public override void WriteNode (XmlReader reader
, bool defattr
)
218 writer
.WriteNode (reader
, defattr
);
221 public override void WriteProcessingInstruction (string name
, string text
)
223 writer
.WriteProcessingInstruction (name
, text
);
226 public override void WriteQualifiedName (string localName
, string ns
)
228 writer
.WriteQualifiedName (localName
, ns
);
231 public override void WriteRaw (string data
)
233 writer
.WriteRaw (data
);
236 public override void WriteRaw (char [] buffer
, int index
, int count
)
238 writer
.WriteRaw (buffer
, index
, count
);
241 public override void WriteStartAttribute (string prefix
, string localName
, string ns
)
243 writer
.WriteStartAttribute (prefix
, localName
, ns
);
246 public override void WriteStartDocument (bool standalone
)
248 writer
.WriteStartDocument (standalone
);
251 public override void WriteStartDocument ()
253 writer
.WriteStartDocument ();
256 public override void WriteStartElement (string prefix
, string localName
, string ns
)
258 writer
.WriteStartElement (prefix
, localName
, ns
);
261 public override void WriteString (string text
)
263 writer
.WriteString (text
);
266 public override void WriteSurrogateCharEntity (char lowChar
, char highChar
)
268 writer
.WriteSurrogateCharEntity (lowChar
, highChar
);
271 public override void WriteWhitespace (string ws
)
273 writer
.WriteWhitespace (ws
);
276 public override WriteState WriteState
{
278 return writer
.WriteState
;
282 public override string XmlLang
{
284 return writer
.XmlLang
;
288 public override XmlSpace XmlSpace
{
290 return writer
.XmlSpace
;