Pregunta

Estoy de análisis de algunos documentos de texto utilizando el OpenXml .Net OpenXml SDK 2.0. Tengo que sustituir ciertas frases con otras frases, como parte del proceso. Mientras que la iteración en los párrafos, Sé que cuando me he encontrado algo que necesito para reemplazar, pero estoy confundido en cuanto a cómo puedo reemplazarlo.

Por ejemplo, digamos que necesito para reemplazar el "a contract exclusively for construction work that is not building work." frase con un fragmento de HTML a un contenido de Sharepoint reutilizable a continuación.

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

PD: Tengo el docx a la conversión de HTML elaborado mediante XSLT, por lo que es una especie de no es un problema en esta etapa

La propiedad InnerText del nodo Párrafo me da el texto propiamente dicho, pero la propiedad de texto interior en sí no es ajustable. Entonces     Regex.Match(currentParagraph.InnerText, currentString).Success vuelve verdadera y me dice que el párrafo actual contiene el texto que quiero.

Como ya he dicho, sí InnerText no es ajustable, por lo que traté creado un nuevo párrafo usando OuterXml es la siguiente.

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

A pesar de que no estoy demasiado preocupado por el formateo en este nivel y que no parece tener ninguna, el OuterXml parece tener elementos adicionales que la derrota la expresión regular.

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

Así que en resumen, ¿cómo iba a reemplazar el texto de un párrafo de OpenXml con otro texto. Aunque sea a costa de perder parte del formato.

¿Fue útil?

Solución

Fijo yo mismo. La clave era eliminar todas las pistas y crear nuevas carreras en el párrafo actual

string modifiedString = Regex.Replace(currentParagraph.InnerText, currentString, reusableContentString);
currentParagraph.RemoveAllChildren<Run>();
currentParagraph.AppendChild<Run>(new Run(new Text(modifiedString)));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top