【问题标题】:How to replace the InnerText of a Comment如何替换评论的 InnerText
【发布时间】:2015-11-11 13:16:15
【问题描述】:

我尝试了以下方法:

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

    }

【问题讨论】:

  • 评论类是什么?从显示的 sn-p 中并不能真正知道。
  • @PhilippeParé 我想替换 InnerText,而不是 InnerXml。 @ZacharyDow 我正在使用DocumentFormat.OpenXml.Wordprocessing.Comment
  • 使用 mainDocumentPart.Document.Save();来自@PhilippeParé 的可能重复不起作用?
  • @ZacharyDow 问题不在于保存文档部分(它工作正常),而是替换内部文本内容的过程。我提供的内容不起作用,就像在副本的第二个答案中解释的那样。我想知道如何替换内容。

标签: c# openxml


【解决方案1】:

只使用不 interxml ,用户文本

 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 " ;
                        }
                    }
                }
            }

【讨论】:

    【解决方案2】:

    这并不容易(但仍然不复杂)。评论具有结构以及文档的正文 - 它可以包含段落、运行等。InnerText 只会返回此评论中所有段落的所有运行的文本值,所以现在你明白为什么你不能只设置这个值了。

    所以首先你必须删除所有评论的段落:

    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】:

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

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

      XmlElement XmlEle = (XmlElement)node;
      

      你也可以用这个简单的方法:

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

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

      像这样:

      XmlEle.InnerText = TopNumber.ToString();
      

      【讨论】:

        【解决方案4】:

        它是只读的,因为它返回删除了所有 XML 标记的 XML 内容。所以设置它会去掉所有的 XML 标记。

        如果您要替换的文本不跨越标签,您可以只替换 XML 中的文本:

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

        【讨论】:

        • @D Stanley 它也不是那样工作的。 InnerText 保持不变。
        • @dcgc 你能提供更多的代码吗,也许错误在其他地方......引用类型的东西
        • @PhilippeParé 代码在 OP 中。
        • @dcgc OP = 原始海报。你的意思是“问题”
        • 你在调试器中运行过吗? InnerText 不会包含 XML 标记,除非它们本身在标记中进行编码,因此您的 if 语句可能不会被命中。
        猜你喜欢
        • 1970-01-01
        • 2013-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多