如何替换注释的InnerText

时间:2015-08-18 14:24:58

标签: c# openxml

我尝试过以下方法:

comment.InnerText=comment.InnerText.Replace(comment.InnerText,new_text);

哪个不起作用,因为我们只能读取InnerText属性。如何有效地更改InnerText值,以便将修改保存到WordProcessing.CommentsPart.CommentsMainDocumentPart.Document

编辑:DocumentFormat.OpenXml.Wordprocessing.Comment是评论的课程。

编辑2:方法:

public void updateCommentInnerTextNewWorkItem(List<Tuple<Int32, String, String>> list){

//DOCX.CDOC.Comments -> WordProcessingCommentsPart.Comments
//DOCX._CIT -> Dictionary<int,string>

        foreach (var comm in DOCX.CDOC.Comments)
        {
            foreach (var item in list)
            {
                foreach (var item_cit in DOCX._CIT)
                {
                   if (((Comment)comm).InnerText.Contains("<tag>") && item.Item3.Contains(item_cit.Value))
                   {
                       comm.InnerXml = comm.InnerXml.Replace(comm.InnerText, item.Item1 + "");
                     //comm.InnerText.Replace(comm.InnerText,item.Item1+"");
                       //DOCX.CDOC.Comments.Save();
                       //DOCX.DOC.MainDocumentPart.Document.Save();
                   }

                   if (((Comment)comm).InnerText.Contains("<tag class") && item.Item3.Contains(item_cit.Value))
                   {
                       //comm.InnerText.Replace(comm.InnerText, item.Item1 + "");
                       comm.InnerXml = comm.InnerXml.Replace(comm.InnerText, item.Item1 + "");
                       //DOCX.CDOC.Comments.Save();
                       //DOCX.DOC.MainDocumentPart.Document.Save();
                   }
                }   
            }                    

        }

        DOCX.CDOC.Comments.Save();
        DOCX.DOC.MainDocumentPart.Document.Save();

    }

4 个答案:

答案 0 :(得分:2)

它是只读的,因为它返回删除了所有XML标记的XML内容。因此设置它将剥离所有XML标记。

如果要替换的文本不跨越标签,则只需替换XML中的文本:

comment.InnerXml=comment.InnerXml.Replace(comment.InnerText,new_text);

答案 1 :(得分:0)

啊......这有点复杂。我遇到过同样的问题。

您将需要XmlElement类。例如,有一个名为xmlDoc的变量已从XmlDocument实例化。 然后你应该使用SelectSingleNode方法来获取你想要编辑的XmlNode的引用。你需要使用它来将XmlNode转换为XmlElement(假设XmlNode被命名为&#39; node&#39;):

XmlElement XmlEle = (XmlElement)node;

同样简单,您可以使用:

XmlElement XmlEle = (XmlElement)xmlDoc.SelectSingleNode("dict/integer");

现在你可以使用变量XmlEle来替换InnerText,因为它只是一个引用。

像这样:

XmlEle.InnerText = TopNumber.ToString();

答案 2 :(得分:0)

这并不容易(但仍然不复杂)。注释具有结构和文档的正文 - 它可以包含段落,运行等.InititeText将只返回此注释中所有段落的所有运行的文本值,所以现在您了解为什么不能只设置此值。

首先,您必须删除所有评论的段落:

comment.RemoveAllChildren<Paragraph>();

下一步是使用包含所需文本的运行添加新段落:

Paragraph paragraph = new Paragraph();
Run run = new Run();
Text text = new Text();
text.Text = "My comment";
run.Append(text);
paragraph.Append(run);
comment.Append(paragraph);

毕竟不要忘记保存更改:

doc.MainDocumentPart.WordprocessingCommentsPart.Comments.Save();

答案 3 :(得分:0)

只使用intterxml而不是用户文本

 foreach (Paragraph paragraph in document.MainDocumentPart.Document.Descendants<DocumentFormat.OpenXml.Wordprocessing.Paragraph>())
            {
                bool ss = paragraph.InnerXml.Contains("commentRangeStart");
                bool ee = paragraph.InnerXml.Contains("commentRangeEnd");
                if (ss && ee)
                {
                    foreach (Run run in paragraph.Elements<Run>())
                    {
                        foreach (Text text in run.Elements<Text>())
                        {
                                text.Text = "your word " ;
                        }
                    }
                }
            }