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()); }
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()); }
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()); }
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); }
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); }
/// <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); }