protected override BodyWriter OnCreateBufferedCopy (
int maxBufferSize)
{
#if true
if (xml_bak == null) {
if (consumed)
throw new InvalidOperationException ("Body xml reader is already consumed");
var sw = new StringWriter ();
var xw = XmlDictionaryWriter.CreateDictionaryWriter (XmlWriter.Create (sw));
xw.WriteStartElement (reader.Prefix, reader.LocalName, reader.NamespaceURI);
xw.WriteAttributes (reader, false);
var inr = reader as IXmlNamespaceResolver;
if (inr != null)
foreach (var p in inr.GetNamespacesInScope (XmlNamespaceScope.ExcludeXml))
if (xw.LookupPrefix (p.Value) != p.Key)
xw.WriteXmlnsAttribute (p.Key, p.Value);
if (!reader.IsEmptyElement) {
reader.Read ();
while (reader.NodeType != XmlNodeType.EndElement)
xw.WriteNode (reader, false);
}
xw.WriteEndElement ();
xw.Close ();
xml_bak = sw.ToString ();
reader = null;
}
#else // FIXME: this should be better, but somehow doesn't work.
if (xml_bak == null) {
if (consumed)
throw new InvalidOperationException ("Body xml reader is already consumed");
var nss = new XmlNamespaceManager (reader.NameTable);
var nsr = reader as IXmlNamespaceResolver;
if (nsr != null)
foreach (var p in nsr.GetNamespacesInScope (XmlNamespaceScope.ExcludeXml))
nss.AddNamespace (p.Key, p.Value);
parser_context = new XmlParserContext (nss.NameTable, nss, reader.XmlLang, reader.XmlSpace);
xml_bak = reader.ReadOuterXml ();
}
#endif
return new XmlReaderBodyWriter (xml_bak, maxBufferSize, parser_context);
}