예제 #1
0
        private static OpenXmlElement CreateElement(string namespaceUri, string name)
        {
            if (string.IsNullOrEmpty(name))
            {
                throw new ArgumentException(nameof(name));
            }

            if (NamespaceIdMap.TryGetNamespaceId(namespaceUri, out byte nsId) &&
                PackageCache.Cache.ParseElementData(typeof(OpenXmlPartRootElement)).Children.Create(nsId, name) is OpenXmlElement element)
            {
                return(element);
            }

            // return unknown element instead of throw exception.
            return(new OpenXmlUnknownElement());
        }
예제 #2
0
        private static OpenXmlElement CreateElement(string namespaceUri, string name)
        {
            if (string.IsNullOrEmpty(name))
            {
                throw new ArgumentException(ExceptionMessages.StringArgumentEmptyException, nameof(name));
            }

            if (NamespaceIdMap.TryGetNamespaceId(namespaceUri, out byte nsId) &&
                ElementLookup.Parts.Create(nsId, name) is OpenXmlElement element)
            {
                return(element);
            }

            // return unknown element instead of throw exception.
            return(new OpenXmlUnknownElement());
        }
예제 #3
0
        private OpenXmlElement CreateElement(string namespaceUri, string name)
        {
            if (string.IsNullOrEmpty(name))
            {
                throw new ArgumentException(nameof(name));
            }

            if (NamespaceIdMap.TryGetNamespaceId(namespaceUri, out byte nsId) &&
                PackageCache.Cache.ParseElement(GetType()).SchemaLookup.Create(nsId, name) is OpenXmlElement element)
            {
                return(element);
            }

            // return unknown element instead of throw exception.
            return(new OpenXmlUnknownElement());
        }
예제 #4
0
        private int GetIndex(string namespaceUri, string tagName)
        {
            if (!string.IsNullOrEmpty(tagName) && namespaceUri != null && NamespaceIdMap.TryGetNamespaceId(namespaceUri, out var nsId))
            {
                for (var i = 0; i < _tags.Length; i++)
                {
                    var tag = _tags[i];

                    if (tag.Name.Equals(tagName, StringComparison.Ordinal) && tag.NamespaceId == nsId)
                    {
                        return(i);
                    }
                }
            }

            return(-1);
        }
예제 #5
0
        internal static OpenXmlElement CreateElement(string namespaceUri, string name)
        {
            // Debug.Assert(namespaceUri != null);
            Debug.Assert(!string.IsNullOrEmpty(name));

            OpenXmlElement newElement = null;
            byte           nsId;

            if ((namespaceUri != null) && NamespaceIdMap.TryGetNamespaceId(namespaceUri, out nsId))
            {
                newElement = CreateElement(nsId, name);
            }

            if (newElement == null)
            {
                // return unknown element instead of throw exception.
                newElement = new OpenXmlUnknownElement();
            }

            return(newElement);
        }
예제 #6
0
        /// <summary>
        /// Load the DOM tree from the Open XML part.
        /// </summary>
        /// <param name="openXmlPart">The part this root element to be loaded from.</param>
        /// <param name="partStream">The stream of the part.</param>
        /// <returns>
        /// Returns true when the part stream is loaded successfully into this root element.
        /// Returns false when the part stream does not contain any xml element.
        /// </returns>
        /// <exception cref="InvalidDataException">Thrown when the part stream contains an incorrect root element.</exception>
        internal bool LoadFromPart(OpenXmlPart openXmlPart, Stream partStream)
        {
            Profiler.CommentMarkProfile(Profiler.MarkId.OpenXmlPartRootElement_LoadFromPart_In);

            if (partStream.Length < 4)
            {
                // The XmlReader.Read() method requires at least four bytes from the data stream in order to begin parsing.
                return(false);
            }

            // set MaxCharactersInDocument to limit the part size on loading DOM.
            this.OpenXmlElementContext.XmlReaderSettings.MaxCharactersInDocument = openXmlPart.MaxCharactersInPart;
            this.OpenXmlElementContext.XmlReaderSettings.DtdProcessing           = DtdProcessing.Prohibit; // set true explicitly for security fix

            using (XmlReader xmlReader = XmlConvertingReaderFactory.Create(partStream, this.OpenXmlElementContext.XmlReaderSettings, openXmlPart.OpenXmlPackage.StrictTranslation))
            {
                this.OpenXmlElementContext.MCSettings = openXmlPart.MCSettings;


                xmlReader.Read();

                if (xmlReader.NodeType == XmlNodeType.XmlDeclaration)
                {
                    string standaloneAttribute = xmlReader.GetAttribute("standalone");
                    if (standaloneAttribute != null)
                    {
                        this._standaloneDeclaration = standaloneAttribute.Equals("yes", StringComparison.OrdinalIgnoreCase);
                    }
                }

                if (!xmlReader.EOF)
                {
                    xmlReader.MoveToContent();
                }

                if (xmlReader.EOF ||
                    XmlNodeType.Element != xmlReader.NodeType ||
                    !xmlReader.IsStartElement())
                {
                    //the stream does NOT contains any xml element.
                    return(false);
                }

                byte nsId;

                if (!NamespaceIdMap.TryGetNamespaceId(xmlReader.NamespaceURI, out nsId) ||
                    nsId != this.NamespaceId ||
                    xmlReader.LocalName != this.LocalName)
                {
                    string elementQName = new XmlQualifiedName(xmlReader.LocalName, xmlReader.NamespaceURI).ToString();
                    string msg          = String.Format(System.Globalization.CultureInfo.CurrentUICulture, ExceptionMessages.Fmt_PartRootIsInvalid, elementQName, this.XmlQualifiedName.ToString());
                    throw new InvalidDataException(msg);
                }

                // remove all children and clear all attributes
                this.OuterXml = string.Empty;
                var mcContextPushed = this.PushMcContext(xmlReader);
                this.Load(xmlReader, this.OpenXmlElementContext.LoadMode);
                if (mcContextPushed)
                {
                    this.PopMcContext();
                }
            }

            Profiler.CommentMarkProfile(Profiler.MarkId.OpenXmlPartRootElement_LoadFromPart_Out);

            return(true);
        }
        internal bool LoadFromPart(OpenXmlPart openXmlPart, Stream partStream)
        {
            if (partStream.Length < 4)
            {
                // The XmlReader.Read() method requires at least four bytes from the data stream in order to begin parsing.
                return(false);
            }

            // set MaxCharactersInDocument to limit the part size on loading DOM.
            OpenXmlElementContext.XmlReaderSettings.MaxCharactersInDocument = openXmlPart.MaxCharactersInPart;

#if FEATURE_XML_PROHIBIT_DTD
            OpenXmlElementContext.XmlReaderSettings.ProhibitDtd = true;                     // set true explicitly for security fix
#else
            OpenXmlElementContext.XmlReaderSettings.DtdProcessing = DtdProcessing.Prohibit; // set to prohibit explicitly for security fix
#endif

            using (XmlReader xmlReader = XmlConvertingReaderFactory.Create(partStream, OpenXmlElementContext.XmlReaderSettings, openXmlPart.OpenXmlPackage.StrictRelationshipFound))
            {
                OpenXmlElementContext.MCSettings = openXmlPart.MCSettings;

                xmlReader.Read();

                if (xmlReader.NodeType == XmlNodeType.XmlDeclaration)
                {
                    string standaloneAttribute = xmlReader.GetAttribute("standalone");
                    if (standaloneAttribute is not null)
                    {
                        _standaloneDeclaration = standaloneAttribute.Equals("yes", StringComparison.OrdinalIgnoreCase);
                    }
                }

                if (!xmlReader.EOF)
                {
                    xmlReader.MoveToContent();
                }

                if (xmlReader.EOF ||
                    xmlReader.NodeType != XmlNodeType.Element ||
                    !xmlReader.IsStartElement())
                {
                    //the stream does NOT contains any xml element.
                    return(false);
                }

                if (!NamespaceIdMap.TryGetNamespaceId(xmlReader.NamespaceURI, out byte nsId) ||
                    nsId != NamespaceId ||
                    xmlReader.LocalName != LocalName)
                {
                    var elementQName = new XmlQualifiedName(xmlReader.LocalName, xmlReader.NamespaceURI).ToString();
                    var msg          = SR.Format(ExceptionMessages.Fmt_PartRootIsInvalid, elementQName, XmlQualifiedName.ToString());

                    throw new InvalidDataException(msg);
                }

                // remove all children and clear all attributes
                OuterXml = string.Empty;
                var mcContextPushed = PushMcContext(xmlReader);
                Load(xmlReader, OpenXmlElementContext.LoadMode);
                if (mcContextPushed)
                {
                    PopMcContext();
                }
            }

            return(true);
        }