From: Oleg T. <he...@us...> - 2004-11-24 16:24:35
|
Update of /cvsroot/mvp-xml/Common/v1/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv18418/v1/src Modified Files: XmlBaseAwareXmlTextReader.cs Log Message: Fixed XmlBase impl... Thanks to kzu for reporting it! Index: XmlBaseAwareXmlTextReader.cs =================================================================== RCS file: /cvsroot/mvp-xml/Common/v1/src/XmlBaseAwareXmlTextReader.cs,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- XmlBaseAwareXmlTextReader.cs 7 Nov 2004 16:41:17 -0000 1.2 +++ XmlBaseAwareXmlTextReader.cs 24 Nov 2004 16:23:40 -0000 1.3 @@ -3,6 +3,7 @@ using System; using System.Xml; using System.IO; +using System.Collections; #endregion @@ -15,7 +16,8 @@ { #region private - private Uri _baseUri = null; + private XmlBaseState _state = new XmlBaseState(); + private Stack _states = null; #endregion @@ -27,7 +29,7 @@ public XmlBaseAwareXmlTextReader(string uri) : base(uri) { - _baseUri = new Uri(base.BaseURI); + _state.BaseUri = new Uri(base.BaseURI); } /// <summary> @@ -37,7 +39,7 @@ public XmlBaseAwareXmlTextReader(string uri, XmlNameTable nt) : base(uri, nt) { - _baseUri = new Uri(base.BaseURI); + _state.BaseUri = new Uri(base.BaseURI); } /// <summary> @@ -53,7 +55,7 @@ public XmlBaseAwareXmlTextReader(string uri, TextReader reader) : base(uri, reader) { - _baseUri = new Uri(base.BaseURI); + _state.BaseUri = new Uri(base.BaseURI); } /// <summary> @@ -70,7 +72,7 @@ public XmlBaseAwareXmlTextReader(string uri, TextReader reader, XmlNameTable nt) : base(uri, reader, nt) { - _baseUri = new Uri(base.BaseURI); + _state.BaseUri = new Uri(base.BaseURI); } /// <summary> @@ -85,7 +87,7 @@ public XmlBaseAwareXmlTextReader(string uri, Stream stream) : base(uri, stream) { - _baseUri = new Uri(base.BaseURI); + _state.BaseUri = new Uri(base.BaseURI); } /// <summary> @@ -102,7 +104,7 @@ public XmlBaseAwareXmlTextReader(string uri, Stream stream, XmlNameTable nt) : base(uri, stream, nt) { - _baseUri = new Uri(base.BaseURI); + _state.BaseUri = new Uri(base.BaseURI); } #endregion @@ -116,7 +118,7 @@ { get { - return _baseUri==null? "" : _baseUri.AbsoluteUri; + return _state.BaseUri==null? "" : _state.BaseUri.AbsoluteUri; } } @@ -126,22 +128,51 @@ public override bool Read() { bool baseRead = base.Read(); - if (baseRead && - base.NodeType == XmlNodeType.Element && - base.HasAttributes) + if (baseRead) { - string baseAttr = GetAttribute("xml:base"); - if (baseAttr == null) - return baseRead; - if (_baseUri == null) - _baseUri = new Uri(baseAttr); - else - _baseUri = new Uri(_baseUri, baseAttr); + if (base.NodeType == XmlNodeType.Element && + base.HasAttributes) + { + string baseAttr = GetAttribute("xml:base"); + if (baseAttr == null) + return baseRead; + Uri newBaseUri = null; + if (_state.BaseUri == null) + newBaseUri = new Uri(baseAttr); + else + newBaseUri = new Uri(_state.BaseUri, baseAttr); + if (_states == null) + _states = new Stack(); + //Push current state and allocate new one + _states.Push(_state); + _state = new XmlBaseState(newBaseUri, base.Depth); + } + else if (base.NodeType == XmlNodeType.EndElement) + { + if (base.Depth == _state.Depth && _states.Count > 0) + { + //Pop previous state + _state = (XmlBaseState)_states.Pop(); + } + } } return baseRead; - } #endregion } + + internal class XmlBaseState + { + public XmlBaseState() {} + + public XmlBaseState(Uri baseUri, int depth) + { + this.BaseUri = baseUri; + this.Depth = depth; + } + + public Uri BaseUri; + public int Depth; + } } |