【问题标题】:Replacing in inner Text in open xml element?在打开的 xml 元素中替换内部文本?
【发布时间】:2011-10-15 17:44:59
【问题描述】:

我正在使用 open xml SDK 2.0,对此我很陌生。

我实际上在我的 word 2007 文档中创建了一个名为“hello.docx”的快速部分(包含内容控件)。现在我需要将快速部分复制到名为“hello.docx”的同一文档的另一个位置。我非常感谢这篇帖子http://www.techques.com/question/1-3448297/Replacing-Content-Controls-in-OpenXML,同样的事情也发布在堆栈溢出论坛上,我非常感谢:)...这篇帖子只是删除了内容控制,但将内容保留在内容控制中。

在上述链接的帮助下,我能够修改代码以克隆内容控件并附加到同一文档(我的这部分代码正在运行)。但是我在innerText中有问题。尽管我在打开的 Xml 元素中替换了 innerText,但它并没有反映在文档中。

public static void AddingSdtBlock(string filename, string sdtBlockTag)
{
    using (WordprocessingDocument doc = WordprocessingDocument.Open(filename,true))
    {
        MainDocumentPart mainDocumentPart = doc.MainDocumentPart;
        List<SdtBlock> sdtList = mainDocumentPart.Document.Descendants<SdtBlock>().ToList();
        SdtBlock sdtA = null;

        foreach (SdtBlock sdt in sdtList)
        {
            if (sdt.SdtProperties.GetFirstChild<Tag>().Val.Value == sdtBlockTag)
            {
                sdtA = sdt;
                break;
            }
        }
        SdtBlock cloneSdkt = (SdtBlock)sdtA.Clone();



        OpenXmlElement sdtc = cloneSdkt.GetFirstChild<SdtContentBlock>();
      //  OpenXmlElement parent = cloneSdkt.Parent;

        OpenXmlElementList elements = cloneSdkt.ChildElements;

       // var mySdtc = new SdtContentBlock(cloneSdkt.OuterXml);

        foreach (OpenXmlElement elem in elements)
        {
          string innerxml=  elem.InnerText ;
          if (innerxml.Length>0)
          {
              string modified = "Class Name : My Class.Description : mydesc.AttributesNameDescriptionMy Attri name.my attri desc.Operations NameDescriptionmy ope name.my ope descriptn.";
             string replace= elem.InnerText.Replace(innerxml, modified);
            // mainDocumentPart.Document.Save();
          }
           // string text = parent.FirstChild.InnerText;
           // parent.Append((OpenXmlElement)elem.Clone());
        }

        mainDocumentPart.Document.Body.AppendChild<SdtBlock>(cloneSdkt);

        //sdtA.Remove();
    }
}

openXML 元素中的 Replaced 字符串未反映在文档中。任何帮助将不胜感激。

提前致谢,

【问题讨论】:

    标签: controls openxml openxml-sdk innertext


    【解决方案1】:

    您的“string replace=”行什么也不做。通过创建变量,您似乎知道 string.Replace() 不是就地替换,但是您没有对变量做任何事情。

    【讨论】:

      【解决方案2】:

      您可以替换InnerXML,而不是替换InnerText

      elem.InnerXml = elem.InnerXml.Replace(innerxml, modified);
      

      然后调用

      mainDocumentPart.Document.Save();
      

      【讨论】:

        【解决方案3】:

        您需要调用mainDocumentPart.Document.Save(); 作为打开文件的using 语句末尾的最后一行。这将保存您在打开文档时对文档所做的任何更改。

        【讨论】:

        • 感谢 Amurra 的建议,
        • Amurra,我尝试这样做但徒劳无功(请参阅我上面的帖子 mainDocumentPart.Document.Save(); 已被评论,因为我已经尝试过)
        • @shishi - 你在拨打mainDocumentPart.Document.Body.AppendChild&lt;SdtBlock&gt;(cloneSdkt); 之后尝试过存档吗?你在哪里调用 save 不会改变文档,因为你没有将克隆的元素附加到文档中。
        【解决方案4】:

        我有同样的问题。 我的解决办法是先替换再克隆。

        【讨论】:

          【解决方案5】:

          您必须使用 for 循环而不是 foreach 循环并使用它的索引器访问每个元素。

          【讨论】:

            【解决方案6】:

            这是一个非常古老的问题,但只是想与使用 OpenXML 2.9 的人分享,因此我建议您删除该 XmlElement 的所有子元素并添加一个包含新内容的新段落,而不是替换 innerText 或 InnerXML 想法:

            var tableCell = mainPart.Document.Body.Elements<TableCell>().First();
            tableCell.RemoveAllChildren();
            tableCell.AppendChild<Paragraph>(new Paragraph(new Run(new Text("This is new text"))));
            mainPart.Document.Save();
            

            或更新现有的文本元素

            var tableCell = mainPart.Document.Body.Elements<TableCell>().First();
            tableCell.Descendants<Text>().FirstOrDefault(e => e.Text == "This is old text");
            if (text != null)
            {
                text.Text = "This is new text";
            }
            mainPart.Document.Save();
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-01-15
              • 2020-06-30
              • 1970-01-01
              • 2015-11-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多