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 IsInvalid (int ch
)
42 public static int IndexOfInvalid (string s
, bool allowSurrogate
)
44 for (int i
= 0; i
< s
.Length
; i
++)
45 if (IsInvalid (s
[i
])) {
46 if (!allowSurrogate
||
50 s
[i
+ 1] < '\uDC00' ||
51 s
[i
+ 1] >= '\uE000')
58 public static int IndexOfInvalid (char [] s
, int start
, int length
, bool allowSurrogate
)
60 int end
= start
+ length
;
62 throw new ArgumentOutOfRangeException ("length");
63 for (int i
= start
; i
< end
; i
++)
64 if (IsInvalid (s
[i
])) {
65 if (!allowSurrogate
||
69 s
[i
+ 1] < '\uDC00' ||
70 s
[i
+ 1] >= '\uE000')
77 public WellFormedXmlWriter (XmlWriter writer
) : base (writer
)
81 public override void WriteString (string text
)
83 int i
= IndexOfInvalid (text
, true);
85 char [] arr
= text
.ToCharArray ();
86 Writer
.WriteChars (arr
, 0, i
);
87 WriteChars (arr
, i
, arr
.Length
- i
);
89 // no invalid character.
90 Writer
.WriteString (text
);
94 public override void WriteChars (char [] text
, int idx
, int length
)
97 int end
= idx
+ length
;
98 while ((idx
= IndexOfInvalid (text
, start
, length
, true)) >= 0) {
100 Writer
.WriteChars (text
, start
, idx
- start
);
101 Writer
.WriteString (String
.Format (CultureInfo
.InvariantCulture
,
102 text
[idx
] < 0x80 ? "\\x{0:X02}" : "\\u{0:X04}",
104 length
-= idx
- start
+ 1;
108 Writer
.WriteChars (text
, start
, end
- start
);
113 public class DefaultXmlWriter
: XmlWriter
117 public DefaultXmlWriter (XmlWriter writer
)
119 this.writer
= writer
;
122 protected XmlWriter Writer
{
123 get { return writer; }
126 public override void Close ()
131 public override void Flush ()
136 public override string LookupPrefix (string ns
)
138 return writer
.LookupPrefix (ns
);
141 public override void WriteBase64 (byte [] buffer
, int index
, int count
)
143 writer
.WriteBase64 (buffer
, index
, count
);
146 public override void WriteBinHex (byte [] buffer
, int index
, int count
)
148 writer
.WriteBinHex (buffer
, index
, count
);
151 public override void WriteCData (string text
)
153 writer
.WriteCData (text
);
156 public override void WriteCharEntity (char ch
)
158 writer
.WriteCharEntity (ch
);
161 public override void WriteChars (char [] buffer
, int index
, int count
)
163 writer
.WriteChars (buffer
, index
, count
);
166 public override void WriteComment (string text
)
168 writer
.WriteComment (text
);
171 public override void WriteDocType (string name
, string pubid
, string sysid
, string subset
)
173 writer
.WriteDocType (name
, pubid
, sysid
, subset
);
176 public override void WriteEndAttribute ()
178 writer
.WriteEndAttribute ();
181 public override void WriteEndDocument ()
183 writer
.WriteEndDocument ();
186 public override void WriteEndElement ()
188 writer
.WriteEndElement ();
191 public override void WriteEntityRef (string name
)
193 writer
.WriteEntityRef (name
);
196 public override void WriteFullEndElement ()
198 writer
.WriteFullEndElement ();
201 public override void WriteName (string name
)
203 writer
.WriteName (name
);
206 public override void WriteNmToken (string name
)
208 writer
.WriteNmToken (name
);
211 public override void WriteNode (XmlReader reader
, bool defattr
)
213 writer
.WriteNode (reader
, defattr
);
216 public override void WriteProcessingInstruction (string name
, string text
)
218 writer
.WriteProcessingInstruction (name
, text
);
221 public override void WriteQualifiedName (string localName
, string ns
)
223 writer
.WriteQualifiedName (localName
, ns
);
226 public override void WriteRaw (string data
)
228 writer
.WriteRaw (data
);
231 public override void WriteRaw (char [] buffer
, int index
, int count
)
233 writer
.WriteRaw (buffer
, index
, count
);
236 public override void WriteStartAttribute (string prefix
, string localName
, string ns
)
238 writer
.WriteStartAttribute (prefix
, localName
, ns
);
241 public override void WriteStartDocument (bool standalone
)
243 writer
.WriteStartDocument (standalone
);
246 public override void WriteStartDocument ()
248 writer
.WriteStartDocument ();
251 public override void WriteStartElement (string prefix
, string localName
, string ns
)
253 writer
.WriteStartElement (prefix
, localName
, ns
);
256 public override void WriteString (string text
)
258 writer
.WriteString (text
);
261 public override void WriteSurrogateCharEntity (char lowChar
, char highChar
)
263 writer
.WriteSurrogateCharEntity (lowChar
, highChar
);
266 public override void WriteWhitespace (string ws
)
268 writer
.WriteWhitespace (ws
);
271 public override WriteState WriteState
{
273 return writer
.WriteState
;
277 public override string XmlLang
{
279 return writer
.XmlLang
;
283 public override XmlSpace XmlSpace
{
285 return writer
.XmlSpace
;