簡體   English   中英

如何用特殊字符替換XML文檔中的文本?

[英]How to replace text in XML document with special chars?

在這篇文章的末尾查看有關文本框的其他問題!

使用這種方法,我想打開一個文檔,替換一些文本,然后不理會它。 它有效,那是值得驕傲的。 :d

public static void replaceInOpenXMLDocument(string pfad, string zuErsetzen, string neuerString)
        {
            using (WordprocessingDocument doc = WordprocessingDocument.Open(pfad, true))
            {
                var res = from bm in doc.MainDocumentPart.Document.Body.Descendants()
                          where bm.InnerText != string.Empty && bm.InnerText.Contains(zuErsetzen) && bm.HasChildren == false
                          select bm;

                foreach (var item in res)
                {
                    item.InsertAfterSelf(new Text(item.InnerText.Replace(zuErsetzen, neuerString)));
                    item.Remove();
                }
                doc.Close();
            }
        }

但是它僅適用於不帶特殊字符的替換。 例如:

操作系統將被Windows over 9000取代

[OS]將保持不變。

情況1:

在文件中:

您將os用於任何目的。

replaceInOpenXMLDocument("C:\NSA\suspects.docx", "os", "Win 2000");

將導致以下結果:

您將Win 2000用於任何目的。

情況2:

與特殊字符...

您可以將[os]用於任何目的。

replaceInOpenXMLDocument("C:\NSA\suspects.docx", "[os]", "Win 2000");

...它只是不理我:

您可以將[os]用於任何目的。

我嘗試了幾個特殊字符()[] {}等,但從未替換過。

有什么我忘了做的事嗎? 還是使用這種方法無法用特殊字符替換? 如果是這樣,我只需要一個簡單的解決方法。

有沒有人可以幫助我絕望? :)

解決方案/添加方式1:

感謝Flowerking 這是我現在正在使用的代碼:

public static void replaceInOpenXMLDocument(string pfad, string zuErsetzen, string neuerString)
        {
            using (WordprocessingDocument doc = WordprocessingDocument.Open(pfad, true))
            {
                SimplifyMarkupSettings settings = new SimplifyMarkupSettings
                {
                    NormalizeXml = true, // Merges Run's in a paragraph with similar formatting

                };
                MarkupSimplifier.SimplifyMarkup(doc, settings);

                //zuErsetzen = new XElement("Name", zuErsetzen).Value;
                var res = from bm in doc.MainDocumentPart.Document.Body.Descendants()
                          where bm.InnerText != string.Empty && bm.InnerText.Contains(zuErsetzen) && bm.HasChildren == false
                          select bm;
                // bm.InnerText.Contains(zuErsetzen)

                foreach (var item in res)
                {
                    item.InsertAfterSelf(new Text(item.InnerText.Replace(zuErsetzen, neuerString)));
                    item.Remove();
                }

                doc.Close();
            }
        }

(此代碼適用於包含普通文本的普通文檔!)

解決方案/添加方式2:如果要替換文本框中的文本 ,我必須做一些解決方法。 文本框被聲明為圖片,因此上面的代碼不會觸及它。

我發現了一個甚至可以通過文本框搜索的附加類( 鏈接 )。 ZIP下載包含一個易於理解的示例程序。

發生這種情況是因為通常在文本包含特殊字符的情況下會創建Open XML詞,如下所示:

  <w:r w:rsidRPr="00316587">
    <w:rPr>
      <w:rFonts w:ascii="Consolas" w:hAnsi="Consolas" w:eastAsia="Times New Roman" w:cs="Consolas" />
      <w:color w:val="823125" />
      <w:sz w:val="20" />
      <w:szCs w:val="20" />
      <w:lang w:eastAsia="en-GB" />
    </w:rPr>
    <w:t>[</w:t>
  </w:r>
  <w:proofErr w:type="gramStart" />
  <w:r w:rsidRPr="00316587">
    <w:rPr>
      <w:rFonts w:ascii="Consolas" w:hAnsi="Consolas" w:eastAsia="Times New Roman" w:cs="Consolas" />
      <w:color w:val="823125" />
      <w:sz w:val="20" />
      <w:szCs w:val="20" />
      <w:lang w:eastAsia="en-GB" />
    </w:rPr>
    <w:t>text-to-replace</w:t>
  </w:r>
  <w:proofErr w:type="gramEnd" />
  <w:r w:rsidRPr="00316587">
    <w:rPr>
      <w:rFonts w:ascii="Consolas" w:hAnsi="Consolas" w:eastAsia="Times New Roman" w:cs="Consolas" />
      <w:color w:val="823125" />
      <w:sz w:val="20" />
      <w:szCs w:val="20" />
      <w:lang w:eastAsia="en-GB" />
    </w:rPr>
    <w:t>]</w:t>
  </w:r>
</w:p>

上面顯示了為文本[text-to-replace]創建的打開xml。 (請注意,並非總是如此,可能取決於您使用的客戶端)。

通過代碼doc.MainDocumentPart.Document.Body.Descendants()的外觀,您將獲取整個文檔主體的所有OpenXmlPart類型Descendants,並嘗試替換一個接一個地迭代的文本,從而OpenXmlPart實際文本分為一個部分,特殊字符分為兩個部分。 因此,該代碼無法滿足要求。

可能有不同的方法來解決此問題。

解:

一個不錯的(我偏愛的)解決方案是使用OpenXml Powertools的 Markup Simplifier標准化xml,這將標准化open xml標記以連接段落中的文本,從而簡化程序設計工作。

示例代碼:

using (WordprocessingDocument doc =
            WordprocessingDocument.Open("Test.docx", true))
 {
      SimplifyMarkupSettings settings = new SimplifyMarkupSettings
      {
             NormalizeXml = true, // Merges Run's in a paragraph with similar formatting

       };
        MarkupSimplifier.SimplifyMarkup(doc, settings);
  }

請參考我的回答這里有關使用MarkupSimplifier更多信息

希望這可以幫助 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM