8

.Net OpenXmlSDK2.0を使用していくつかのOpenxmlワードドキュメントを解析しています。処理の一環として、特定の文を他の文に置き換える必要があります。段落を繰り返しながら、いつ置き換える必要があるかを見つけましたが、どのように置き換えることができるかについて困惑しています。

たとえば、"a contract exclusively for construction work that is not building work."以下のSharepointReusableコンテンツのhtmlスニペットに文を置き換える必要があるとします。

<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:xsltを使用してdocxからHtmlへの変換を実行したので、この段階では問題ありません。

Paragraphノードの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の段落のテキストを他のテキストに置き換えるにはどうすればよいでしょうか。フォーマットの一部を失うことを犠牲にしてさえ。

4

2 に答える 2

13

自分で修正しました。重要なのは、すべての実行を削除し、現在の段落で新しい実行を作成することでした

string modifiedString = Regex.Replace(currentParagraph.InnerText, currentString, reusableContentString);
currentParagraph.RemoveAllChildren<Run>();
currentParagraph.AppendChild<Run>(new Run(new Text(modifiedString)));
于 2010-11-26T00:24:52.793 に答える
1

すべての段落にはテキスト要素が含まれているため、テキスト要素を見つけてそのテキストを更新する必要があります。次に例を示します。

var text = part.RootElement.Descendants<Text>().FirstOrDefault(e=>e.Text == "a contract exclusively for construction work that is not building work.");
if(text != null)
{
    text.Text = "New text here";
}
mainPart.Document.Save();
于 2020-01-06T11:05:49.147 に答える