Exemple #1
0
        /// <summary>
        /// Processes the &lt;gx:angles&gt;, &lt;gx:coord&gt; and &lt;when&gt;
        /// elements.
        /// </summary>
        /// <param name="orphan">The <see cref="Element"/> to add.</param>
        protected internal override void AddOrphan(Element orphan)
        {
            UnknownElement unknown = orphan as UnknownElement;

            if (unknown != null)
            {
                XmlComponent data = unknown.UnknownData;
                if (AnglesComponent.Equals(data))
                {
                    this.AddChild(new AnglesElement(unknown.InnerText));
                    return;
                }
                if (CoordComponent.Equals(data))
                {
                    this.AddChild(new CoordElement(unknown.InnerText));
                    return;
                }
                if (WhenComponent.Equals(data))
                {
                    this.AddChild(new WhenElement(unknown.InnerText));
                    return;
                }
            }
            base.AddOrphan(orphan);
        }
Exemple #2
0
        public override void VisitUnknownElement(UnknownElement element)
        {
            string xmlName = element.Xml.Name.ToString()
                             .ToLowerInvariant();

            if (xmlName.Equals("b") ||
                xmlName.Equals("i") || xmlName.Equals("a") ||
                xmlName.Equals("sup") || xmlName.Equals("i"))
            {
                var sb = new StringBuilder();
                sb.Append("<" + xmlName);
                foreach (var attr in element.Xml.Attributes())
                {
                    sb.Append(" " + attr.Name.ToString() + "=");
                    sb.Append("\"" + HtmlEscape(attr.Value) + "\"");
                }
                sb.Append(">");
                this.Write(sb.ToString());
                base.VisitUnknownElement(element);
                this.Write("</" + xmlName + ">");
            }
            else
            {
                base.VisitUnknownElement(element);
            }
        }
        /// <summary>Adds the gx:value to <see cref="Values"/>.</summary>
        /// <param name="orphan">The <see cref="Element"/> to add.</param>
        protected internal override void AddOrphan(Element orphan)
        {
            UnknownElement unknown = orphan as UnknownElement;

            if (unknown != null)
            {
                if (ValueComponent.Equals(unknown.UnknownData))
                {
                    this.AddValue(unknown.InnerText);
                    return;
                }
            }
            base.AddOrphan(orphan);
        }
Exemple #4
0
        // Reads an element from the PQDIF file.
        private Element ReadElement(BinaryReader recordBodyReader)
        {
            Element element;

            Guid         tagOfElement  = new Guid(recordBodyReader.ReadBytes(16));
            ElementType  typeOfElement = (ElementType)recordBodyReader.ReadByte();
            PhysicalType typeOfValue   = (PhysicalType)recordBodyReader.ReadByte();
            bool         isEmbedded    = recordBodyReader.ReadByte() != 0;

            // Read reserved byte
            recordBodyReader.ReadByte();

            long link;
            long returnLink;

            returnLink = recordBodyReader.BaseStream.Position + 8L;

            if (!isEmbedded || typeOfElement != ElementType.Scalar)
            {
                link = recordBodyReader.ReadInt32();
                recordBodyReader.BaseStream.Seek(link, SeekOrigin.Begin);
            }

            switch (typeOfElement)
            {
            case ElementType.Collection:
                element = ReadCollection(recordBodyReader);
                break;

            case ElementType.Scalar:
                element = ReadScalar(recordBodyReader, typeOfValue);
                break;

            case ElementType.Vector:
                element = ReadVector(recordBodyReader, typeOfValue);
                break;

            default:
                element             = new UnknownElement(typeOfElement);
                element.TypeOfValue = typeOfValue;
                break;
            }

            element.TagOfElement = tagOfElement;
            recordBodyReader.BaseStream.Seek(returnLink, SeekOrigin.Begin);

            return(element);
        }
Exemple #5
0
        /// <summary>
        /// Processes the &lt;gx:angles&gt;, &lt;gx:coord&gt; and &lt;when&gt;
        /// elements.
        /// </summary>
        /// <param name="orphan">The <see cref="Element"/> to add.</param>
        protected internal override void AddOrphan(Element orphan)
        {
            UnknownElement unknown = orphan as UnknownElement;

            if (unknown != null)
            {
                Element child = ConvertUnknown(unknown);
                if (child != null)
                {
                    this.AddChild(child);
                    return;
                }
            }

            base.AddOrphan(orphan);
        }
Exemple #6
0
        /// <summary>
        /// Deserializes the specified <see cref="PlainTextReader"/> to the specified type.
        /// </summary>
        /// <param name="reader"><see cref="PlainTextReader"/> thatcontains the <see cref="object"/> to be deserialized.</param>
        /// <param name="type"><see cref="Type"/> of the deserialized <see cref="object"/>.</param>
        /// <returns>Returns an instance of the specified <see cref="Type"/> loaded from the <see cref="PlainTextReader"/>.</returns>
        /// <exception cref="ArgumentNullException"/>
        /// <exception cref="FormatException">Occurs when a property did not have the correct format.</exception>
        public object Deserialize(PlainTextReader reader, Type type)
        {
            if (type == null)
            {
                throw new ArgumentNullException(nameof(type));
            }
            if (reader == null)
            {
                throw new ArgumentNullException(nameof(reader));
            }
            object instance = Activator.CreateInstance(type);

            try {
                ReadValueObject readItem;
                while ((readItem = reader.ReadNextValue()) != null)
                {
                    if (string.IsNullOrWhiteSpace(readItem.Name))
                    {
                        throw new FormatException(Resources.SerializationExceptionStrings.PropertyNameEmpty);
                    }
                    if (string.IsNullOrWhiteSpace(readItem.Value))
                    {
                        throw new FormatException(
                                  string.Format(Resources.SerializationExceptionStrings.PropertyValueEmpty, readItem.Name));
                    }

                    PropertyInfo property = GetProperty(readItem.Name, type);
                    if (property != null)
                    {
                        property.SetValue(instance, Decoder.DecodeUnknown(readItem.Value, property.PropertyType));
                        continue;
                    }
                    FieldInfo field = GetField(readItem.Name, type);
                    if (field != null)
                    {
                        field.SetValue(instance, Decoder.DecodeUnknown(readItem.Value, field.FieldType));
                        continue;
                    }
                    UnknownElement?.Invoke(readItem);
                }
            }
            catch (FormatException ex) {
                throw new FormatException(string.Format(Resources.SerializationExceptionStrings.InvalidSettingFormat,
                                                        reader.Position) + Environment.NewLine + ex.Message, ex);
            }
            return(instance);
        }
Exemple #7
0
        private static Element ConvertUnknown(UnknownElement unknown)
        {
            XmlComponent data = unknown.UnknownData;

            if (AnglesComponent.Equals(data))
            {
                return(new AnglesElement(unknown.InnerText));
            }
            else if (CoordComponent.Equals(data))
            {
                return(new CoordElement(unknown.InnerText));
            }
            else if (WhenComponent.Equals(data))
            {
                DateTime value;
                if (DateTime.TryParse(unknown.InnerText, CultureInfo.InvariantCulture, DateTimeStyles.None, out value))
                {
                    return(new WhenElement(value));
                }
            }

            return(null);
        }
Exemple #8
0
        private static Element ConvertUnknown(UnknownElement unknown)
        {
            XmlComponent data = unknown.UnknownData;
            if (AnglesComponent.Equals(data))
            {
                return new AnglesElement(unknown.InnerText);
            }
            else if (CoordComponent.Equals(data))
            {
                return new CoordElement(unknown.InnerText);
            }
            else if (WhenComponent.Equals(data))
            {
                DateTime value;
                if (DateTime.TryParse(unknown.InnerText, CultureInfo.InvariantCulture, DateTimeStyles.None, out value))
                {
                    return new WhenElement(value);
                }
            }

            return null;
        }
Exemple #9
0
        private Element GetElement()
        {
            if (_reader.Depth > MaxNestingDepth)
            {
                throw new InvalidOperationException("Maximum nesting depth has been reached.");
            }

            if (_reader.NodeType != XmlNodeType.Element)
            {
                return(null);
            }

            // Need to check this here before we move to the attributes,
            // as reader.NodeType will never be EndElement for empty elements
            // and when we move to an attribute, IsEmptyElement doesn't work
            bool isEmpty = _reader.IsEmptyElement;

            Element parent = KmlFactory.CreateElement(this.GetXmlComponent());

            if (parent == null)
            {
                parent = new UnknownElement(new XmlComponent(_reader));
            }
            else if (parent is IHtmlContent)
            {
                this.ProcessAttributes(parent);

                // No need to process all the children
                string text = string.Empty;
                if (!isEmpty) // Is there something to parse?
                {
                    text = XmlExtractor.FlattenXml(_reader);
                }

                ((IHtmlContent)parent).Text = text;
                return(parent);
            }

            this.ProcessAttributes(parent); // Empties can have attributes though

            if (!isEmpty)                   // Is there any text/children to process?
            {
                while (_reader.Read())
                {
                    if (_reader.NodeType == XmlNodeType.EndElement)
                    {
                        break;
                    }

                    switch (_reader.NodeType)
                    {
                    case XmlNodeType.Element:
                        this.AddChild(parent);
                        break;

                    case XmlNodeType.CDATA:     // Treat like normal text
                    case XmlNodeType.Text:
                        parent.AddInnerText(_reader.Value);
                        break;
                    }
                }
            }
            return(parent);
        }
Exemple #10
0
        public static Element?Read(XmlReader reader, IElementFactory elementFactory)
        {
            var elements = new List <Element>();
            var stack    = new Stack <Element>();

            while (reader.Read())
            {
                switch (reader.NodeType)
                {
                case XmlNodeType.None:
                    break;

                case XmlNodeType.Element:
                {
                    string  localName = reader.LocalName;
                    Element element;

                    if (string.IsNullOrEmpty(reader.NamespaceURI) || elementFactory.Namespaces.Contains(reader.NamespaceURI))
                    {
                        var parent = stack.Count > 0 ? stack.Peek() : null;

                        element        = elementFactory.Create(localName, parent);
                        element.Parent = parent;

                        if (reader.MoveToFirstAttribute())
                        {
                            do
                            {
                                if (string.IsNullOrEmpty(reader.NamespaceURI) || elementFactory.Namespaces.Contains(reader.NamespaceURI))
                                {
                                    string attributeName = reader.LocalName;
                                    element.Attributes.Add(attributeName, reader.Value);
                                }
                            }while (reader.MoveToNextAttribute());
                            reader.MoveToElement();
                        }

                        var children = parent != null ? parent.Children : elements;
                        children.Add(element);
                    }
                    else
                    {
                        element = new UnknownElement()
                        {
                            Tag = localName, Parent = null
                        };
                    }

                    if (!reader.IsEmptyElement)
                    {
                        stack.Push(element);
                    }
                }
                break;

                case XmlNodeType.Attribute:
                    break;

                case XmlNodeType.Text:
                {
                    var element = stack.Peek();
                    var content = new ContentElement()
                    {
                        Content = reader.Value
                    };
                    element.Children.Add(content);
                }
                break;

                case XmlNodeType.CDATA:
                {
                    var element = stack.Peek();
                    var content = new ContentElement()
                    {
                        Content = reader.Value
                    };
                    element.Children.Add(content);
                }
                break;

                case XmlNodeType.EntityReference:
                {
                    reader.ResolveEntity();
                    var element = stack.Peek();
                    var content = new ContentElement()
                    {
                        Content = reader.Value
                    };
                    element.Children.Add(content);
                }
                break;

                case XmlNodeType.Entity:
                    break;

                case XmlNodeType.ProcessingInstruction:
                    break;

                case XmlNodeType.Comment:
                    break;

                case XmlNodeType.Document:
                    break;

                case XmlNodeType.DocumentType:
                    break;

                case XmlNodeType.DocumentFragment:
                    break;

                case XmlNodeType.Notation:
                    break;

                case XmlNodeType.Whitespace:
                    break;

                case XmlNodeType.SignificantWhitespace:
                    break;

                case XmlNodeType.EndElement:
                {
                    var element = stack.Pop();

                    foreach (var child in element.Children)
                    {
                        if (child is ContentElement content)
                        {
                            element.Content += content.Content;
                        }
                    }
                }
                break;

                case XmlNodeType.EndEntity:
                    break;

                case XmlNodeType.XmlDeclaration:
                    break;

                default:
                    break;
                }
            }
            if (elements.Count == 1)
            {
                return(elements[0]);
            }
            return(null);
        }
Exemple #11
0
        // Reads an element from the PQDIF file.
        private Element ReadElement(BinaryReader recordBodyReader)
        {
            Element element;

            Guid         tagOfElement  = Guid.Empty;
            ElementType  typeOfElement = 0;
            PhysicalType typeOfValue   = 0;
            bool         isEmbedded;

            // Calculate the location of the next element
            // after this one in case we encounter any errors
            long nextLink = recordBodyReader.BaseStream.Position + 28L;

            try
            {
                tagOfElement  = new Guid(recordBodyReader.ReadBytes(16));
                typeOfElement = (ElementType)recordBodyReader.ReadByte();
                typeOfValue   = (PhysicalType)recordBodyReader.ReadByte();
                isEmbedded    = recordBodyReader.ReadByte() != 0;

                // Read reserved byte
                recordBodyReader.ReadByte();

                long link;
                long returnLink;

                returnLink = recordBodyReader.BaseStream.Position + 8L;

                if (!isEmbedded || typeOfElement != ElementType.Scalar)
                {
                    link = recordBodyReader.ReadInt32();

                    if (link < 0 || link >= recordBodyReader.BaseStream.Length)
                    {
                        throw new InvalidOperationException("Element link is outside the bounds of the file");
                    }

                    recordBodyReader.BaseStream.Seek(link, SeekOrigin.Begin);
                }

                switch (typeOfElement)
                {
                case ElementType.Collection:
                    element = ReadCollection(recordBodyReader);
                    break;

                case ElementType.Scalar:
                    element = ReadScalar(recordBodyReader, typeOfValue);
                    break;

                case ElementType.Vector:
                    element = ReadVector(recordBodyReader, typeOfValue);
                    break;

                default:
                    element             = new UnknownElement(typeOfElement);
                    element.TypeOfValue = typeOfValue;
                    break;
                }

                element.TagOfElement = tagOfElement;
                recordBodyReader.BaseStream.Seek(returnLink, SeekOrigin.Begin);

                return(element);
            }
            catch (Exception ex)
            {
                m_exceptionList.Add(ex);

                // Jump to the location of the next element after this one
                if (nextLink < recordBodyReader.BaseStream.Length)
                {
                    recordBodyReader.BaseStream.Seek(nextLink, SeekOrigin.Begin);
                }
                else
                {
                    recordBodyReader.BaseStream.Seek(0L, SeekOrigin.End);
                }

                return(new ErrorElement(typeOfElement, ex)
                {
                    TagOfElement = tagOfElement,
                    TypeOfValue = typeOfValue
                });
            }
        }
Exemple #12
0
 public override void VisitUnknownElement(UnknownElement element)
 {
     string xmlName = element.Xml.Name.ToString()
     .ToLowerInvariant();
       if (xmlName.Equals("b") ||
     xmlName.Equals("i") || xmlName.Equals("a") ||
     xmlName.Equals("sup") || xmlName.Equals("i")) {
     var sb = new StringBuilder();
     sb.Append("<" + xmlName);
     foreach (var attr in element.Xml.Attributes()) {
       sb.Append(" " + attr.Name.ToString() + "=");
       sb.Append("\"" + HtmlEscape(attr.Value) + "\"");
     }
     sb.Append(">");
     this.Write(sb.ToString());
     base.VisitUnknownElement(element);
     this.Write("</" + xmlName + ">");
       } else {
     base.VisitUnknownElement(element);
       }
 }
Exemple #13
0
 public extern static AngularDetailsElement Angular(this UnknownElement el);
Exemple #14
0
        private Element CreateNode(XmlNodeResult nd, Element parent)
        {
            string ens;

            if (nd.Prefix != null)
            {
                RemObjects.InternetPack.XMPP.Elements.Attribute at = nd.Attribute.FirstOrDefault(a => a.Prefix == "xmlns" && a.Name == nd.Prefix);
                if (at == null)
                {
                    Element el = parent;
                    ens = string.Empty;
                    while (el != null)
                    {
                        RemObjects.InternetPack.XMPP.Elements.Attribute els = el.Attributes.Where(a => a.Prefix == "xmlns" && a.Name == nd.Prefix).FirstOrDefault();
                        if (els != null)
                        {
                            ens = els.Value;
                            break;
                        }
                        el = el.Parent;
                    }
                }
                else
                {
                    ens = at.Value;
                }
            }
            else
            {
                RemObjects.InternetPack.XMPP.Elements.Attribute at = nd.Attribute.FirstOrDefault(a => a.Prefix == null && a.Name == "xmlns");
                if (at == null)
                {
                    ens = string.Empty;
                }
                else
                {
                    ens = at.Value;
                }
            }
            Element res = null;

            switch (ens)
            {
            case Namespaces.ClientStreamNamespace:
            case Namespaces.ServerStreamNamespace:
            case "":
                if (ens == null && parent != null && parent.Type == ElementType.IQ && nd.Name == "error")
                {
                    res = new IQError();
                }
                else
                {
                    switch (nd.Name)
                    {
                    case "iq":
                        res = new IQ();
                        break;

                    case "presence":
                        res = new Presence();
                        break;

                    case "message":
                        res = new Message();
                        break;
                    }
                }
                break;

            case Namespaces.StreamNamespace:
                switch (nd.Name)
                {
                case "stream":

                    RemObjects.InternetPack.XMPP.Elements.Attribute att = nd.Attribute.FirstOrDefault(a => a.Prefix == null && a.Name == "xmlns");
                    if (att == null || att.Value == Namespaces.ClientStreamNamespace)
                    {
                        res = new ClientStream();
                    }
                    else
                    {
                        res = new ServerStream();
                    }
                    break;

                case "features":
                    res = new StreamFeatures();
                    break;

                case "error":
                    res = new StreamError();
                    break;
                }
                break;

            case Namespaces.StartTLSNamespace:
                switch (nd.Name)
                {
                case "starttls":
                    res = new StartTLS();
                    break;

                case "failure":
                    res = new StartTLSFailure();
                    break;

                case "proceed":
                    res = new StartTLSProceed();
                    break;
                }

                break;

            case Namespaces.SaslNamespace:
                switch (nd.Name)
                {
                case "mechanisms":
                    res = new Mechanisms();
                    break;

                case "auth":
                    res = new SaslAuth();
                    break;

                case "challenge":
                    res = new SaslChallenge();
                    break;

                case "response":
                    res = new SaslResponse();
                    break;

                case "abort":
                    res = new SaslAbort();
                    break;

                case "success":
                    res = new SaslSuccess();
                    break;

                case "failure":
                    res = new SaslFailure();
                    break;
                }
                break;
            }
            if (res == null)
            {
                res = new UnknownElement();
            }
            else
            {
                res.Attributes.Clear(); // default ones shouldn't be here during the reading process
            }
            if (parent != null)
            {
                res.Parent = parent;
                if (parent != fServerRoot)
                {
                    parent.Elements.Add(res);
                }
            }
            res.Prefix = nd.Prefix;
            res.Name   = nd.Name;
            foreach (var el in nd.Attribute)
            {
                res.Attributes.Add(el);
            }
            return(res);
        }
Exemple #15
0
        /// <summary>
        /// See <see cref="Visitor.VisitUnknownElement"/>.
        /// </summary>
        public override void VisitUnknownElement(UnknownElement element)
        {
            if (delegates.VisitUnknownElement != null)
                delegates.VisitUnknownElement(element);

            base.VisitUnknownElement(element);
        }
Exemple #16
0
        /// <summary>
        /// Reads all supported documentation elements.
        /// </summary>
        private static IEnumerable<Element> ReadContent(XElement xml)
        {
            foreach (var node in xml.Nodes())
            {
                var element = default(Element);
                switch (node.NodeType)
                {
                    case System.Xml.XmlNodeType.Element:
                        var elementNode = (XElement)node;
                        switch (elementNode.Name.LocalName)
                        {
                            case "summary":
                                element = new Summary(ReadContent(elementNode));
                                break;
                            case "remarks":
                                element = new Remarks(ReadContent(elementNode));
                                break;
                            case "example":
                                element = new Example(ReadContent(elementNode));
                                break;
                            case "para":
                                element = new Para(ReadContent(elementNode));
                                break;
                            case "param":
                                element = new Param(FindAttribute(elementNode, "name"), ReadContent(elementNode));
                                break;
                            case "paramref":
                                element = new ParamRef(FindAttribute(elementNode, "name"));
                                break;
                            case "typeparam":
                                element = new TypeParam(FindAttribute(elementNode, "name"), ReadContent(elementNode));
                                break;
                            case "typeparamref":
                                element = new TypeParamRef(FindAttribute(elementNode, "name"));
                                break;
                            case "code":
                                element = new Code(TrimCode(elementNode.Value));
                                break;
                            case "c":
                                element = new C(elementNode.Value);
                                break;
                            case "see":
                                element = new See(FindAttribute(elementNode, "cref"), FindAttribute(elementNode, "langword"), elementNode.Value, ReadContent(elementNode));
                                break;
                            case "seealso":
                                element = new SeeAlso(FindAttribute(elementNode, "cref"), elementNode.Value, ReadContent(elementNode));
                                break;
                            case "list":
                                element = new List(FindAttribute(elementNode, "type"), ReadContent(elementNode));
                                break;
                            case "listheader":
                                element = new ListHeader(ReadContent(elementNode));
                                break;
                            case "term":
                                element = new Term(ReadContent(elementNode));
                                break;
                            case "description":
                                element = new Description(ReadContent(elementNode));
                                break;
                            case "item":
                                element = new Item(ReadContent(elementNode));
                                break;
                            case "exception":
                                element = new Exception(FindAttribute(elementNode, "cref"), ReadContent(elementNode));
                                break;
                            case "value":
                                element = new Value(ReadContent(elementNode));
                                break;
                            case "returns":
                                element = new Returns(ReadContent(elementNode));
                                break;
                            default:
                                element = new UnknownElement(elementNode, ReadContent(elementNode));
                                break;
                        }
                        break;
                    case System.Xml.XmlNodeType.Text:
                        element = new Text(TrimText(((XText)node).Value));
                        break;
                    default:
                        break;
                }

                if (element != null)
                {
                    element.SetLineInfo(xml as IXmlLineInfo);
                    yield return element;
                }
            }
        }
Exemple #17
0
        // Reads an element from the PQDIF file.
        private Element ReadElement(BinaryReader recordBodyReader)
        {
            Element element;

            Guid tagOfElement = Guid.Empty;
            ElementType typeOfElement = 0;
            PhysicalType typeOfValue = 0;
            bool isEmbedded;

            // Calculate the location of the next element
            // after this one in case we encounter any errors
            long nextLink = recordBodyReader.BaseStream.Position + 28L;

            try
            {
                tagOfElement = new Guid(recordBodyReader.ReadBytes(16));
                typeOfElement = (ElementType)recordBodyReader.ReadByte();
                typeOfValue = (PhysicalType)recordBodyReader.ReadByte();
                isEmbedded = recordBodyReader.ReadByte() != 0;

                // Read reserved byte
                recordBodyReader.ReadByte();

                long link;
                long returnLink;

                returnLink = recordBodyReader.BaseStream.Position + 8L;

                if (!isEmbedded || typeOfElement != ElementType.Scalar)
                {
                    link = recordBodyReader.ReadInt32();

                    if (link < 0 || link >= recordBodyReader.BaseStream.Length)
                        throw new InvalidOperationException("Element link is outside the bounds of the file");

                    recordBodyReader.BaseStream.Seek(link, SeekOrigin.Begin);
                }

                switch (typeOfElement)
                {
                    case ElementType.Collection:
                        element = ReadCollection(recordBodyReader);
                        break;

                    case ElementType.Scalar:
                        element = ReadScalar(recordBodyReader, typeOfValue);
                        break;

                    case ElementType.Vector:
                        element = ReadVector(recordBodyReader, typeOfValue);
                        break;

                    default:
                        element = new UnknownElement(typeOfElement);
                        element.TypeOfValue = typeOfValue;
                        break;
                }

                element.TagOfElement = tagOfElement;
                recordBodyReader.BaseStream.Seek(returnLink, SeekOrigin.Begin);

                return element;
            }
            catch (Exception ex)
            {
                m_exceptionList.Add(ex);

                // Jump to the location of the next element after this one
                if (nextLink < recordBodyReader.BaseStream.Length)
                    recordBodyReader.BaseStream.Seek(nextLink, SeekOrigin.Begin);
                else
                    recordBodyReader.BaseStream.Seek(0L, SeekOrigin.End);

                return new ErrorElement(typeOfElement, ex)
                {
                    TagOfElement = tagOfElement,
                    TypeOfValue = typeOfValue
                };
            }
        }
Exemple #18
0
 /// <summary>
 /// Visits an unknown documentation element.
 /// </summary>
 public virtual void VisitUnknownElement(UnknownElement element)
 {
     VisitContainer(element);
 }