From: Oleg T. <he...@us...> - 2004-10-31 09:03:08
|
Update of /cvsroot/mvp-xml/XInclude/v1/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv14200/v1/src Modified Files: SR.resx XIncludingReader.cs Log Message: Fixing bugs. Index: XIncludingReader.cs =================================================================== RCS file: /cvsroot/mvp-xml/XInclude/v1/src/XIncludingReader.cs,v retrieving revision 1.20 retrieving revision 1.21 diff -u -d -r1.20 -r1.21 --- XIncludingReader.cs 30 Oct 2004 09:56:27 -0000 1.20 +++ XIncludingReader.cs 31 Oct 2004 08:02:27 -0000 1.21 @@ -73,6 +73,8 @@ private bool _exposeTextAsCDATA; //Work in streaming mode (no support for intra-document references) private bool _streamingMode = true; + //Precompiled XPath expression for selecting ancestors with xml:base + private XPathExpression _selectBases; #endregion #region Constructors @@ -1221,8 +1223,38 @@ Uri includeLocation; try { - if (_xmlResolver == null) - includeLocation = new Uri(new Uri(_reader.BaseURI), href, false); + if (_xmlResolver == null) + { + if (_streamingMode) + { + includeLocation = new Uri(new Uri(_reader.BaseURI), href, false); + } + else + { + //Reconstruct base URI + IHasXPathNavigator hasXPathNav = _reader as IHasXPathNavigator; + if (hasXPathNav != null) + { + Uri baseUri = new Uri(_reader.BaseURI); + XPathNavigator node = hasXPathNav.GetNavigator(); + if (_selectBases == null) + { + _selectBases = node.Compile("ancestor-or-self::*/@xml:base"); + XmlNamespaceManager nsm = new XmlNamespaceManager(_nameTable); + nsm.AddNamespace(_keywords.Xml, _keywords.XmlNamespace); + _selectBases.SetContext(nsm); + } + XPathNodeIterator ni = node.Select(_selectBases); + while (ni.MoveNext()) + baseUri = new Uri(baseUri, ni.Current.Value, false); + includeLocation = new Uri(baseUri, href, false); + } + else + { + throw new InvalidOperationException("WTF????"); + } + } + } else includeLocation = _xmlResolver.ResolveUri(new Uri(_reader.BaseURI), href); } @@ -1424,13 +1456,21 @@ private XmlReader CreateAcquiredInfoset(string uri, Stream stream) { //TODO: Try to stream out this stuff - XIncludingReader xir = new XIncludingReader(uri, stream, _nameTable); + XIncludingReader xir = new XIncludingReader(uri, stream, _nameTable, _streamingMode); StringWriter sw = new StringWriter(); XmlTextWriter w = new XmlTextWriter(sw); - while (xir.Read()) - w.WriteNode(xir, false); - xir.Close(); - w.Close(); + try + { + while (xir.Read()) + w.WriteNode(xir, false); + } + finally + { + if (xir != null) + xir.Close(); + if (w != null) + w.Close(); + } return new XmlTextReader(uri, new StringReader(sw.ToString())); } @@ -1465,10 +1505,10 @@ _readers.Push(_reader); //For an intra-document reference (via xpointer attribute) //the source infoset is used as the acquired infoset. - IHasXPathNavigator hxn = _reader as IHasXPathNavigator; - if (_reader != null) + IHasXPathNavigator hasXPathNav = _reader as IHasXPathNavigator; + if (hasXPathNav != null) { - XPathNavigator nav = hxn.GetNavigator(); + XPathNavigator nav = hasXPathNav.GetNavigator(); nav.MoveToRoot(); _reader = new XPointerReader(nav, xpointer); return Read(); @@ -1615,20 +1655,34 @@ private bool ProcessIntraDocTextInclusion() { //Ok, in non-streaming mode _reader must implement IHasXPathNavigator - if (_reader is IHasXPathNavigator) + IHasXPathNavigator hasXPathNav = _reader as IHasXPathNavigator; + if (hasXPathNav != null) { - XPathNavigator nav = ((IHasXPathNavigator)_reader).GetNavigator(); - nav.MoveToRoot(); - XPathNavigatorReader r= new XPathNavigatorReader(nav); - r.Read(); - //Push current reader to the stack - _readers.Push(_reader); - _reader = new TextIncludingReader(r.ReadOuterXml(), _exposeTextAsCDATA); - r.Close(); - return Read(); + XPathNavigator nav = hasXPathNav.GetNavigator(); + IHasXmlNode hasXmlNode = nav as IHasXmlNode; + if (hasXmlNode != null) + { + XmlDocument currentDoc = hasXmlNode.GetNode().OwnerDocument; + //Push current reader to the stack + _readers.Push(_reader); + _reader = new TextIncludingReader(currentDoc.OuterXml, _exposeTextAsCDATA); + return Read(); + } + else + { + throw new InvalidOperationException("How this could happen?"); +// nav.MoveToRoot(); +// XPathNavigatorReader r= new XPathNavigatorReader(nav); +// r.Read(); +// //Push current reader to the stack +// _readers.Push(_reader); +// _reader = new TextIncludingReader(r.ReadOuterXml(), _exposeTextAsCDATA); +// r.Close(); +// return Read(); + } } else - throw new InvalidOperationException("How this could happen?"); + throw new InvalidOperationException("How this could happen?"); } /// <summary> @@ -1649,7 +1703,10 @@ } else r = reader; - XPathDocument doc = new XPathDocument(r, XmlSpace.Preserve); + XmlDocument doc = new XmlDocument(); + doc.PreserveWhitespace = true; + doc.Load(r); + r.Close(); return new XPathNavigatorReader(doc.CreateNavigator()); } Index: SR.resx =================================================================== RCS file: /cvsroot/mvp-xml/XInclude/v1/src/SR.resx,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- SR.resx 28 Oct 2004 18:27:05 -0000 1.5 +++ SR.resx 31 Oct 2004 08:02:27 -0000 1.6 @@ -91,7 +91,7 @@ <value>'href' or 'xpointer' attributes can't both be omitted on xi:include element. Location: {0}, Line {1}, Position {2}.</value> </data> <data name="IntradocumentReferencesNotSupported" type="System.String" mimetype="System.String"> - <value>Intra-document references are not supported in the streaming mode.</value> + <value>Intra-document references are not supported in the streaming mode</value> </data> <data name="CustomXmlResolverError" type="System.String" mimetype="System.String"> <value>An exception has occured during GetEntity call to custom XmlResolver.</value> |