2010-11-25 96 views
4

我使用.Net OpenXml SDK 2.0解析了一些Openxml文檔。作爲處理的一部分,我需要用其他句子替換某些句子。在迭代段落時,我知道什麼時候我發現了一些我需要替換的東西,但是我很難理解如何替換它。如何使用OpenXML替換段落的文本Sdk

例如,假設我需要用一個html代碼替換句子"a contract exclusively for construction work that is not building work."以下面的Sharepoint可重用內容。

<span class="ms-rtestate-read ms-reusableTextView" contentEditable="false" id="__publishingReusableFragment" fragmentid="/Sites/Sandbox/ReusableContent/132_.000" >a contract exclusively for construction work that is not building work.</span>

PS:我得到了DOCX到HTML的轉換制定了使用XSLT,所以這是一種不是在這個階段出現問題

段落節點的InnerText屬性給了我正確的文本,但內部文本屬性本身是不可設置的。所以 Regex.Match(currentParagraph.InnerText, currentString).Success 返回true,並告訴我當前段落包含我想要的文本。

正如我所說,InnerText本身是不可設置的,所以我嘗試使用outerxml創建一個新的段落如下。

string modifiedOuterxml = Regex.Replace(currentParagraph.OuterXml, currentString, reusableContentString); 
OpenXmlElement parent = currentParagraph.Parent; 
Paragraph modifiedParagraph = new Paragraph(modifiedOuterxml); 
parent.ReplaceChild<Paragraph>(modifiedParagraph, currentParagraph); 

即使我沒有太在意在這個級別的格式,它似乎並沒有爲已任,在outerXML似乎有打敗正則表達式多餘的元素。

..."16" /><w:lang w:val="en-AU" /></w:rPr><w:t>a</w:t></w:r><w:proofErr w:type="gramEnd" /> <w:r w:rsidRPr="00C73B58"><w:rPr><w:sz w:val="16" /><w:szCs w:val="16" /><w:lang w:val="en-AU" /></w:rPr><w:t xml:space="preserve"> contract exclusively for construction work that is not building work.</w:t></w:r></w:p>

因此,在總結,我將如何替換OPENXML與其他文本段落文本。即使以犧牲一些格式化爲代價。

回答

6

我自己修復了。關鍵是要刪除所有運行並在當前段落中創建新運行

string modifiedString = Regex.Replace(currentParagraph.InnerText, currentString, reusableContentString); 
currentParagraph.RemoveAllChildren<Run>(); 
currentParagraph.AppendChild<Run>(new Run(new Text(modifiedString))); 
相關問題