Замена во внутреннем тексте в открытом элементе XML? - PullRequest
3 голосов
/ 29 июля 2011

Я использую open xml SDK 2.0, и я немного новичок в этом.

Я на самом деле создал в моем документе 2007 года quickpart (управление контентом) под названием "hello.docx".Теперь мне нужно скопировать QuickPart в другое место того же документа с именем «hello.docx».Я был очень благодарен за это сообщение http://www.techques.com/question/1-3448297/Replacing-Content-Controls-in-OpenXML, и то же самое опубликовано на форуме переполнения стека, за что я был очень благодарен: :) ... Это сообщение просто удаляет управление контентом, но сохраняет его в управлении контентом.

С помощью вышеуказанной ссылки я смог изменить код, чтобы клонировать элемент управления контентом и добавить к тому же документу (эта часть моего кода работает).Но у меня есть проблема во внутреннем тексте.Хотя я заменяю innerText в элементе open Xml, он не отражается в документе.

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 не отражается в документе.Любая помощь будет очень признательна.

Заранее спасибо,

Ответы [ 5 ]

1 голос
/ 23 июля 2013

Ваша строка "string replace =" ничего не делает. Создавая переменную, вы, кажется, понимаете, что string.Replace () не является заменой на месте, но тогда вы ничего не делаете с переменной.

0 голосов
/ 10 июля 2014

Вместо замены InnerText вы можете заменить InnerXML

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

, а затем вызвать

mainDocumentPart.Document.Save();
0 голосов
/ 06 февраля 2012

У меня была такая же проблема. мое решение - сначала сделать замену, а затем клонировать.

0 голосов
/ 14 марта 2012

Вы должны использовать цикл for вместо цикла foreach и доступ к каждому элементу с помощью его индексатора.

0 голосов
/ 08 августа 2011

Вам нужно вызвать mainDocumentPart.Document.Save(); в качестве последней строки в конце вашего оператора using, открывающего файл. Это сохранит все изменения, которые вы внесли в документ, пока он был открыт.

...