[英]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.