if(n == null) break;
AppendChild (n);
} while (true);
+ xmlReader.Close ();
}
public virtual void LoadXml (string xml)
// hack ;-)
XmlTextReader xtReader = reader as XmlTextReader;
if(xtReader == null) {
+ // XmlTextReader doesn't allow such creation that starts reading from Doctype.
+ /*
xtReader = new XmlTextReader (reader.ReadOuterXml (),
XmlNodeType.DocumentType,
new XmlParserContext (NameTable, ConstructNamespaceManager(), XmlLang, XmlSpace));
xtReader.Read ();
+ */
+ newNode = CreateDocumentType (reader.Name, reader ["PUBLIC"], reader ["SYSTEM"], reader.Value);
+ } else {
+ newNode = ReadDoctypeNode (xtReader);
}
- newNode = ReadDoctypeNode (xtReader);
if(currentNode != null)
throw new XmlException ("XmlDocumentType at invalid position.");
break;
ignoredWhitespace = true;
break;
}
- reader.Read ();
+ if (!reader.Read ())
+ break;
} while (ignoredWhitespace || reader.Depth > startDepth ||
(reader.Depth == startDepth && reader.NodeType == XmlNodeType.EndElement));
+ if (startDepth != reader.Depth && reader.EOF)
+ throw new XmlException ("Unexpected end of xml reader.");
return resultNode != null ? resultNode : newNode;
}
#region XmlStreamReader
public class XmlStreamReader : StreamReader
{
+ XmlInputStream input;
+
XmlStreamReader (XmlInputStream input)
: base (input, input.ActualEncoding != null ? input.ActualEncoding : Encoding.UTF8)
{
+ this.input = input;
}
public XmlStreamReader (Stream input)
: this (new XmlInputStream (url, docent))
{
}
+
+ public override void Close ()
+ {
+ this.input.Close ();
+ }
+
+ protected override void Dispose (bool disposing)
+ {
+ base.Dispose (disposing);
+ if (disposing) {
+ Close ();
+ }
+ }
}
#endregion
\r
}\r
}\r
\r
- public override void Flush()\r
+ public override void Close ()\r
+ {\r
+ stream.Close ();\r
+ }\r
+\r
+ public override void Flush ()\r
{\r
stream.Flush ();\r
}\r
ownerDoc.onNodeRemoving (oldChild, oldChild.ParentNode);
- if (NodeType == XmlNodeType.Document || NodeType == XmlNodeType.Element || NodeType == XmlNodeType.Attribute || NodeType == XmlNodeType.DocumentFragment) {
- if (IsReadOnly)
- throw new ArgumentException ("This node is read only.");
+ if (NodeType != XmlNodeType.Attribute &&
+ NodeType != XmlNodeType.Element &&
+ NodeType != XmlNodeType.Document &&
+ NodeType != XmlNodeType.DocumentFragment)
+ throw new ArgumentException (String.Format ("This {0} node cannot remove child.", NodeType));
- if (Object.ReferenceEquals (LastLinkedChild, LastLinkedChild.NextLinkedSibling) && Object.ReferenceEquals (LastLinkedChild, oldChild))
- LastLinkedChild = null;
- else {
- XmlLinkedNode oldLinkedChild = (XmlLinkedNode)oldChild;
- XmlLinkedNode beforeLinkedChild = LastLinkedChild;
-
- while (!Object.ReferenceEquals (beforeLinkedChild.NextLinkedSibling, LastLinkedChild) && !Object.ReferenceEquals (beforeLinkedChild.NextLinkedSibling, oldLinkedChild))
- beforeLinkedChild = beforeLinkedChild.NextLinkedSibling;
+ if (IsReadOnly)
+ throw new ArgumentException (String.Format ("This {0} node is read only.", NodeType));
- if (!Object.ReferenceEquals (beforeLinkedChild.NextLinkedSibling, oldLinkedChild))
- throw new ArgumentException ();
+ if (Object.ReferenceEquals (LastLinkedChild, LastLinkedChild.NextLinkedSibling) && Object.ReferenceEquals (LastLinkedChild, oldChild))
+ // If there is only one children, simply clear.
+ LastLinkedChild = null;
+ else {
+ XmlLinkedNode oldLinkedChild = (XmlLinkedNode) oldChild;
+ XmlLinkedNode beforeLinkedChild = LastLinkedChild;
+ XmlLinkedNode firstChild = (XmlLinkedNode) FirstChild;
+
+ while (Object.ReferenceEquals (beforeLinkedChild.NextLinkedSibling, LastLinkedChild) == false &&
+ Object.ReferenceEquals (beforeLinkedChild.NextLinkedSibling, oldLinkedChild) == false)
+ beforeLinkedChild = beforeLinkedChild.NextLinkedSibling;
- beforeLinkedChild.NextLinkedSibling = oldLinkedChild.NextLinkedSibling;
- oldLinkedChild.NextLinkedSibling = null;
- }
+ if (Object.ReferenceEquals (beforeLinkedChild.NextLinkedSibling, oldLinkedChild) == false)
+ throw new ArgumentException ();
- ownerDoc.onNodeRemoved (oldChild, oldChild.ParentNode);
- oldChild.parentNode = null; // clear parent 'after' above logic.
+ beforeLinkedChild.NextLinkedSibling = oldLinkedChild.NextLinkedSibling;
- return oldChild;
- }
- else
- throw new ArgumentException (String.Format ("This {0} node cannot remove child.", NodeType));
+ // Each derived class may have its own LastLinkedChild, so we must set it explicitly.
+ if (oldLinkedChild.NextLinkedSibling == firstChild)
+ this.LastLinkedChild = beforeLinkedChild;
+
+ oldLinkedChild.NextLinkedSibling = null;
+ }
+
+ ownerDoc.onNodeRemoved (oldChild, oldChild.ParentNode);
+ oldChild.parentNode = null; // clear parent 'after' above logic.
+
+ return oldChild;
}
public virtual XmlNode ReplaceChild (XmlNode newChild, XmlNode oldChild)