private OpenXmlElement CreateChildElement() { Debug.Assert(_elementStack.Count > 0); Debug.Assert(_xmlReader != null); OpenXmlElement element = _elementStack.Peek(); // AlternateContent / Choice / Fallback needs special treatment // The ElementFactory( ) of the Choice / Fallback depends on the parent of AlternateContentChoice // TODO: find a better solution if (element is AlternateContentChoice || element is AlternateContentFallback) { if (_elementStack.Count > 2) { OpenXmlElement topElement = _elementStack.Pop(); OpenXmlElement acElement = _elementStack.Pop(); OpenXmlElement parentsParent = _elementStack.Peek().CloneNode(false); _elementStack.Push(acElement); _elementStack.Push(topElement); element = topElement.CloneNode(false); acElement = new AlternateContent(); acElement.AppendChild(element); parentsParent.AppendChild(acElement); } } return(element.ElementFactory(_xmlReader)); }
/// <summary> /// Trys to create an OpenXmlElement from the specified namesapce URI and local name. /// </summary> /// <param name="parent">The parent element.</param> /// <param name="fileFormat">The specified file format version.</param> /// <param name="namespaceUri">The namespace URI of the requested child element.</param> /// <param name="localName">The local name of the requested child element.</param> /// <returns>A new OpenXmlElement if the parent element can contains a child with the specified namespace and local name. Otherwise, returns null.</returns> internal static OpenXmlElement TryCreateValidChild(this OpenXmlElement parent, FileFormatVersions fileFormat, string namespaceUri, string localName) { Debug.Assert(parent is OpenXmlCompositeElement); Debug.Assert(localName != null); var newElement = parent.ElementFactory(string.Empty, localName, namespaceUri); if (newElement is OpenXmlUnknownElement || !newElement.IsInVersion(fileFormat)) { return(null); } return(newElement); }
internal override OpenXmlElement ElementFactory(byte namespaceId, string name) { OpenXmlElement newElement = null; if (Parent != null && Parent is AlternateContent) { OpenXmlElement parentsParentElemnt = Parent.Parent; if (parentsParentElemnt != null) { newElement = parentsParentElemnt.ElementFactory(namespaceId, name); } } return(newElement); }