public void Visit(ISvgUseElement element) { SvgUseElement useElement = (SvgUseElement)element; SvgDocument document = useElement.OwnerDocument; XmlElement refEl = useElement.ReferencedElement; if (refEl == null) { return; } bool isImported = false; // For the external node, the documents are different, and we may not be // able to insert this node, so we first import it... if (useElement.OwnerDocument != refEl.OwnerDocument) { var importedNode = useElement.OwnerDocument.ImportNode(refEl, true) as XmlElement; if (importedNode != null) { var importedSvgElement = importedNode as SvgElement; if (importedSvgElement != null) { importedSvgElement.Imported = true; importedSvgElement.ImportNode = refEl as SvgElement; importedSvgElement.ImportDocument = refEl.OwnerDocument as SvgDocument; } refEl = importedNode; isImported = true; } } XmlElement refElParent = (XmlElement)refEl.ParentNode; useElement.OwnerDocument.Static = true; useElement.CopyToReferencedElement(refEl); if (!isImported) // if imported, we do not need to remove it... { refElParent.RemoveChild(refEl); } useElement.AppendChild(refEl); // Now, render the use element... var refElement = useElement?.FirstChild; IElementVisitorTarget evt = refElement as IElementVisitorTarget; if (evt != null) { evt.Accept(this); } useElement.RemoveChild(refEl); useElement.RestoreReferencedElement(refEl); if (!isImported) { refElParent.AppendChild(refEl); } useElement.OwnerDocument.Static = false; }
public void Accept(IElementVisitor visitor) { visitor.Visit(this); if (this.HasChildNodes) { visitor.BeginContainer(this); foreach (var item in this.ChildNodes) { IElementVisitorTarget evt = item as IElementVisitorTarget; if (evt != null) { evt.Accept(visitor); } } visitor.EndContainer(this); } }