无法插入OpenXmlElement“newChild”,因为它是树的一部分。

19
我正在收到一个错误,标题说明了这一点。 我正在尝试使用OpenXml隐藏Word文档中的所有文本。 当我尝试追加段落属性时,我收到上面的错误。 在网上找不到有关此错误的信息。
代码返回错误
        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;

            }
       }

您还需要将Vanish添加到“Run”属性中,以使效果生效。 - Flowerking
好的,那么我是需要先逐个运行Vanish,然后再逐个段落消失吗?还是我需要以某种方式将运行属性附加到段落对象上? - user1704863
1个回答

47

通常可以通过克隆引发异常的节点,然后插入该克隆值来修复此错误。类似于这样:

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);

这将创建一个 Color 实例,然后通过克隆原始实例并插入它来为所有边框使用相同的实例。


1
那恰好就是我面临的问题,这个完美地解决了它。谢谢! - Ber'Zophus
2
CloneNode!@amurra:你真是救星! - slayernoah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接