Custom XmlReader supporting XML Base.

Author: Oleg Tkachenko, http://www.xmllab.net.

Наследование: XmlWrappingReader
Пример #1
0
        public void BasicTest() 
        {
            XmlReader r = new XmlBaseAwareXmlReader("../../Common/XmlBaseAwareXmlReaderTests/test.xml");
            while (r.Read()) 
            {
                if (r.NodeType == XmlNodeType.Element) 
                {
                    switch (r.Name) 
                    {
                        case "catalog":
                            Assert.IsTrue(r.BaseURI.EndsWith("XmlBaseAwareXmlReaderTests/test.xml"));
                            break;
                        case "files":
                            Assert.IsTrue(r.BaseURI == "file:///d:/Files/");
                            break;
                        case "file":
                            Assert.IsTrue(r.BaseURI == "file:///d:/Files/");
                            break;
                        case "a":
							Assert.IsTrue(r.BaseURI.EndsWith("XmlBaseAwareXmlReaderTests/test.xml"));
                            break;
                        case "b":
                            Assert.IsTrue(r.BaseURI == "file:///d:/Files/a/");
                            break;
                        case "c":
                            Assert.IsTrue(r.BaseURI == "file:///d:/Files/c/");
                            break;
                        case "e":
                            Assert.IsTrue(r.BaseURI == "file:///d:/Files/c/");
                            break;
                        case "d":
                            Assert.IsTrue(r.BaseURI == "file:///d:/Files/a/");
                            break;
                    }
                }
                else if (r.NodeType == XmlNodeType.Text && r.Value.Trim() != "") 
                {
                    Assert.IsTrue(r.BaseURI == "file:///d:/Files/c/");                    
                }
                else if (r.NodeType == XmlNodeType.Comment) 
                {
                    Assert.IsTrue(r.BaseURI == "file:///d:/Files/a/");                    
                }
                else if (r.NodeType == XmlNodeType.ProcessingInstruction) 
                {
                    Assert.IsTrue(r.BaseURI == "file:///d:/Files/");                    
                }
            }
            r.Close();
        }   
Пример #2
0
		public void ReaderWithPath() 
		{
            XmlReaderSettings settings = new XmlReaderSettings();
            settings.IgnoreWhitespace = true;
			XmlReader r = new XmlBaseAwareXmlReader("../../Common/XmlBaseAwareXmlReaderTests/relativeTest.xml");			
			XPathDocument doc = new XPathDocument(r);
			XPathNavigator nav = doc.CreateNavigator();
			XPathNodeIterator ni = nav.Select("/catalog");
			ni.MoveNext();
			Assert.IsTrue(ni.Current.BaseURI.EndsWith("/XmlBaseAwareXmlReaderTests/relativeTest.xml"));
			ni = nav.Select("/catalog/relative/relativenode");
			ni.MoveNext();
			Console.WriteLine(ni.Current.BaseURI);
			Assert.IsTrue(ni.Current.BaseURI.IndexOf("/XmlBaseAwareXmlReaderTests/") != -1);
		}   
Пример #3
0
        /// <summary>
        /// Processes inter-document inclusion (xml mode).
        /// </summary>
        /// <param name="href">'href' attr value</param>
        /// <param name="xpointer">'xpointer attr value'</param>
        private bool ProcessInterDocXMLInclusion(string href, string xpointer)
        {
            //Include document as XML
            Uri includeLocation = ResolveHref(href);
            if (includeLocation.Fragment != String.Empty)
                throw new XIncludeSyntaxError(Monobjc.Tools.Sdp.Properties.Resources.FragmentIDInHref);
            CheckLoops(includeLocation, xpointer);
            if (_xmlResolver == null)
            {
                //No custom resolver
                if (xpointer != null)
                {
                    //Push current reader to the stack
                    _readers.Push(_reader);
                    //XPointers should be resolved against the acquired infoset,
                    //not the source infoset
                    _reader = new XPointerReader(includeLocation.AbsoluteUri,
                        CreateAcquiredInfoset(includeLocation),
                        xpointer);
                }
                else
                {
                    WebResponse wRes;
                    Stream stream = GetResource(includeLocation.AbsoluteUri,
                        _reader.GetAttribute(_keywords.Accept),
                        _reader.GetAttribute(_keywords.AcceptLanguage), out wRes);
                    //Push current reader to the stack
                    _readers.Push(_reader);
                    XmlReaderSettings settings = new XmlReaderSettings();
                    settings.XmlResolver = _xmlResolver;
                    settings.IgnoreWhitespace = (_whiteSpaceHandling == WhitespaceHandling.None);
                    XmlReader r = new XmlBaseAwareXmlReader(wRes.ResponseUri.AbsoluteUri, stream, _nameTable);
                    _reader = r;
                }
                return Read();
            }
            else
            {
                //Custom resolver provided, let's ask him
                object resource;
                try
                {
                    resource = _xmlResolver.GetEntity(includeLocation, null, null);
                }
                catch (Exception e)
                {
                    throw new ResourceException(Monobjc.Tools.Sdp.Properties.Resources.CustomXmlResolverError, e);
                }
                if (resource == null)
                    throw new ResourceException(Monobjc.Tools.Sdp.Properties.Resources.CustomXmlResolverReturnedNull);

                //Push current reader to the stack
                _readers.Push(_reader);

                //Ok, we accept Stream, TextReader and XmlReader only
                if (resource is Stream)
                    resource = new StreamReader((Stream)resource);
                if (xpointer != null)
                {
                    if (resource is TextReader)
                    {
                        //XPointers should be resolved against the acquired infoset,
                        //not the source infoset
                        _reader = new XPointerReader(includeLocation.AbsoluteUri,
                            CreateAcquiredInfoset(includeLocation, (TextReader)resource),
                            xpointer);
                    }
                    else if (resource is XmlReader)
                    {
                        XmlReader r = (XmlReader)resource;
                        _reader = new XPointerReader(r.BaseURI,
                            CreateAcquiredInfoset(r), xpointer);
                    }
                    else
                    {
                        //Unsupported type
                        throw new ResourceException(String.Format(
                            CultureInfo.CurrentCulture,
                            Monobjc.Tools.Sdp.Properties.Resources.CustomXmlResolverReturnedUnsupportedType,
                            resource.GetType().ToString()));
                    }
                }
                else
                {
                    //No XPointer
                    if (resource is TextReader)
                        _reader = new XmlBaseAwareXmlReader(includeLocation.AbsoluteUri, (TextReader)resource, _nameTable);
                    else if (resource is XmlReader)
                        _reader = (XmlReader)resource;
                    else
                    {
                        //Unsupported type
                        throw new ResourceException(String.Format(
                            CultureInfo.CurrentCulture,
                            Monobjc.Tools.Sdp.Properties.Resources.CustomXmlResolverReturnedUnsupportedType,
                            resource.GetType().ToString()));
                    }
                }

                return Read();
            }
        }