Beispiel #1
0
        public void ElementCloneTest()
        {
            using (var stream = GetStream(TestFiles.mcdoc))
                using (var doc = WordprocessingDocument.Open(stream, false))
                {
                    // Shallow clone the body, which doesn't have attributes
                    var body       = doc.MainDocumentPart.Document.Body;
                    var clonedBody = body.CloneNode(false);
                    Assert.False(clonedBody.HasChildren);
                    Assert.Equal(body.HasAttributes, clonedBody.HasAttributes); //Cloned Body has no attributes.
                    Assert.Equal(body.ExtendedAttributes.Count(), clonedBody.ExtendedAttributes.Count());

                    // Shallow clone the first paragraph, which has attributes
                    var paragraph       = body.Descendants <Paragraph>().First();
                    var clonedParagraph = paragraph.CloneNode(false);
                    Assert.False(clonedParagraph.HasChildren);
                    Assert.True(clonedParagraph.HasAttributes);
                    Assert.Equal(paragraph.Attributes.Length, clonedParagraph.Attributes.Length);
                    Assert.Equal(paragraph.ExtendedAttributes.Count(), clonedParagraph.ExtendedAttributes.Count());

                    // Deep clone the document
                    var clonedDocument = doc.MainDocumentPart.Document.CloneNode(true);
                    Assert.True(clonedDocument.HasChildren);
                    Assert.Equal(doc.MainDocumentPart.Document.ChildElements.Count, clonedDocument.ChildElements.Count);
                    Assert.Equal(doc.MainDocumentPart.Document.Descendants().Count(), clonedDocument.Descendants().Count());
                    var docEnumerator = doc.MainDocumentPart.Document.Descendants().GetEnumerator();
                    foreach (var elem in clonedDocument.Descendants())
                    {
                        Assert.True(docEnumerator.MoveNext());
                        var curElem = docEnumerator.Current;
                        Assert.Equal(curElem.GetType(), elem.GetType());
                        Assert.Equal(curElem.NamespaceUri, elem.NamespaceUri);
                        Assert.Equal(curElem.XmlQualifiedName, elem.XmlQualifiedName);
                        Assert.Equal(curElem.Attributes.Length, elem.Attributes.Length);

                        Assert.Equal(curElem.ExtendedAttributes.Count(), elem.ExtendedAttributes.Count());
                        var a1 = curElem.ExtendedAttributes.ToArray();
                        var a2 = elem.ExtendedAttributes.ToArray();
                        for (var i = 0; i < a1.Length; i++)
                        {
                            Assert.Equal(a1[i].NamespaceUri, a2[i].NamespaceUri);
                            Assert.Equal(a1[i].LocalName, a2[i].LocalName);
                            Assert.Equal(a1[i].Value, a2[i].Value);
                        }

                        Assert.Equal(curElem.MCAttributes == null, elem.MCAttributes == null);
                        if (curElem is OpenXmlLeafTextElement)
                        {
                            Assert.Equal(((OpenXmlLeafTextElement)curElem).Text, ((OpenXmlLeafTextElement)elem).Text);
                        }
                    }

                    // Deep clone the unknown element
                    var unknown       = doc.MainDocumentPart.Document.Descendants <OpenXmlUnknownElement>().Where(e => e.LocalName == "wsp").First();
                    var clonedUnknown = unknown.CloneNode(true);
                    Assert.Equal(unknown.OuterXml, clonedUnknown.OuterXml);

                    // Clone the OpenXmlMiscNode
                    var miscNode       = new OpenXmlMiscNode(System.Xml.XmlNodeType.Comment, "<!-- my comment -->");
                    var clonedMiscNode = miscNode.CloneNode(true) as OpenXmlMiscNode;
                    Assert.NotNull(clonedMiscNode);
                    Assert.Equal(miscNode.XmlNodeType, clonedMiscNode.XmlNodeType);
                    Assert.Equal(miscNode.OuterXml, clonedMiscNode.OuterXml);

                    // Shallow clone mc element
                    var acb = body.Descendants <AlternateContent>().First();
                    acb.MCAttributes                    = new MarkupCompatibilityAttributes();
                    acb.MCAttributes.Ignorable          = "w14";
                    acb.MCAttributes.MustUnderstand     = "wp";
                    acb.MCAttributes.PreserveAttributes = "a";
                    acb.MCAttributes.PreserveElements   = "w14";
                    acb.MCAttributes.ProcessContent     = "wp";
                    var clonedAcb = acb.CloneNode(false);
                    Assert.NotNull(clonedAcb.MCAttributes);
                    Assert.Equal(acb.MCAttributes.Ignorable.Value, clonedAcb.MCAttributes.Ignorable.Value);
                    Assert.Equal(acb.MCAttributes.MustUnderstand.Value, clonedAcb.MCAttributes.MustUnderstand.Value);
                    Assert.Equal(acb.MCAttributes.PreserveAttributes.Value, clonedAcb.MCAttributes.PreserveAttributes.Value);
                    Assert.Equal(acb.MCAttributes.PreserveElements.Value, clonedAcb.MCAttributes.PreserveElements.Value);
                    Assert.Equal(acb.MCAttributes.ProcessContent.Value, clonedAcb.MCAttributes.ProcessContent.Value);
                }
        }