Cannot insert the OpenXmlElement “newChild” because it is part of a tree

≯℡__Kan透↙ 提交于 2019-12-18 04:40:34

问题


The Title states the error I am getting. I'm trying to hide all the text in a word doc using OpenXml. Currently when I try and append the Paragraph properties I receive the above error. I can't find much about this error online.

Code that returns error

        using (WordprocessingDocument wdDoc = WordprocessingDocument.Open(mDoc_copy, true))
        {
            // Manage namespaces to perform XPath queries.
            NameTable nt = new NameTable();
            XmlNamespaceManager nsManager = new XmlNamespaceManager(nt);
            nsManager.AddNamespace("w", wordmlNamespace);

            // Get the document part from the package.
            // Load the XML in the document part into an XmlDocument instance.
            XmlDocument xdoc = new XmlDocument(nt);
            xdoc.Load(wdDoc.MainDocumentPart.GetStream());

            MainDocumentPart main = wdDoc.MainDocumentPart;

            IEnumerable<OpenXmlElement> elem = main.Document.Body.Descendants().ToList();
            Paragraph p;
            ParagraphProperties pp = new ParagraphProperties();
            ParagraphMarkRunProperties prmp = new ParagraphMarkRunProperties();
            Vanish v = new Vanish();
            apprmp.AppendChild<Vanish>(v);
            pp.AppendChild<ParagraphMarkRunProperties>(apprmp);


            foreach (Paragraph para in main.Document.Body.Descendants<Paragraph>().ToList())
            {


                    para.ParagraphProperties = pp;

            }
       }

回答1:


Normally this error can be fixed by Cloning whatever node is causing the exception and then inserting that cloned value. Something like this:

LeftBorder leftBorder = new LeftBorder() { Style = BorderStyleValues.Thin };
TopBorder topBorder = new TopBorder() { Style = BorderStyleValues.Thin };
RightBorder rightBorder = new RightBorder() { Style = BorderStyleValues.Thin };
BottomBorder bottomBorder = new BottomBorder() { Style = BorderStyleValues.Thin };

Color color = new Color() { Auto = true, Rgb = rgbHexValue == string.Empty ? new HexBinaryValue("00000000") : new HexBinaryValue(rgbHexValue) };

leftBorder.Color = color;
topBorder.Color = (Color)color.CloneNode(true);
rightBorder.Color = (Color)color.CloneNode(true);
bottomBorder.Color = (Color)color.CloneNode(true);

This will create one Color instance and then use the same instance for all the borders by cloning the original instance then inserting it.



来源:https://stackoverflow.com/questions/16320537/cannot-insert-the-openxmlelement-newchild-because-it-is-part-of-a-tree

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!