Domanda

Io sono l'analisi di alcuni documenti Word OpenXML utilizzando .NET OpenXml SDK 2.0. Ho bisogno di sostituire alcune frasi con altre frasi come parte del trattamento. Mentre l'iterazione di paragrafi, so che quando ho trovato qualcosa che ho bisogno di sostituire, ma stumped quanto a come posso sostituirlo.

Ad esempio, consente di dire che ho bisogno di sostituire il "a contract exclusively for construction work that is not building work." frase con un frammento di codice HTML a un contenuto di SharePoint riutilizzabile sotto.

<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: ho avuto la docx alla conversione Html elaborato utilizzando XSLT, così che è sorta di non è un problema in questa fase

La proprietà InnerText del nodo Paragrafo mi dà testo vero e proprio, ma la proprietà testo interno in sé non è impostabile. Così     Regex.Match(currentParagraph.InnerText, currentString).Success restituisce vero e mi dice che il paragrafo corrente contiene il testo che voglio.

Come ho detto, InnerText sé non è impostabile, così ho provato creato un nuovo paragrafo utilizzando OuterXml è indicato di seguito.

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

Anche se non sono troppo preoccupato per la formattazione a questo livello e non sembrano avere alcuna, l'OuterXml sembra avere elementi in più che la sconfitta il regex.

..."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>

Quindi, in sintesi, come faccio a sostituire il testo di un paragrafo di OpenXml con altro testo. Anche a scapito di perdere una parte della formattazione.

È stato utile?

Soluzione

Fisso io stesso. La chiave è stato quello di rimuovere tutte le piste e creare nuovi percorsi nel paragrafo corrente

string modifiedString = Regex.Replace(currentParagraph.InnerText, currentString, reusableContentString);
currentParagraph.RemoveAllChildren<Run>();
currentParagraph.AppendChild<Run>(new Run(new Text(modifiedString)));
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top