У меня есть приложение в C#, которое читает текст из файла слова (.docx), используя Open XML.
В общем, есть набор параграфов (p), которые содержат элементы Run (р). Я могу перебрать узлы Run с помощью
foreach ( var run in para.Descendants<Run>() )
{
...
}
. В одном конкретном документе c есть текст «START», который разбит на три части: «ST», «AR» и «T». Каждый из них определяется узлом Run, но в двух случаях узел Run содержится в узле «smartTag».
<w:smartTag w:uri="urn:schemas-microsoft-com:office:smarttags" w:element="PersonName">
<w:r w:rsidRPr="00BF444F">
<w:rPr>
<w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial"/>
<w:b/>
<w:bCs/>
<w:sz w:val="40"/>
<w:szCs w:val="40"/>
</w:rPr>
<w:t>ST</w:t>
</w:r>
</w:smartTag>
<w:smartTag w:uri="urn:schemas-microsoft-com:office:smarttags" w:element="PersonName">
<w:r w:rsidRPr="00BF444F">
<w:rPr>
<w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial"/>
<w:b/>
<w:bCs/>
<w:sz w:val="40"/>
<w:szCs w:val="40"/>
</w:rPr>
<w:t>AR</w:t>
</w:r>
</w:smartTag>
<w:r w:rsidRPr="00BF444F">
<w:rPr>
<w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial"/>
<w:b/>
<w:bCs/>
<w:sz w:val="40"/>
<w:szCs w:val="40"/>
</w:rPr>
<w:t xml:space="preserve">T</w:t>
</w:r>
Насколько я могу судить, Open XML не поддерживает узел SmartTag. В результате он просто генерирует узлы OpenXmlUnknownElement.
Что делает это трудным, так это то, что он генерирует узлы OpenXmlUnknownElement для всех дочерних узлов smartTag. Это означает, что я не могу просто получить первый дочерний узел и привести его к Run.
Получить текст (через свойство InnerText) легко, но мне также нужно получить информацию о форматировании.
Есть ли достаточно простой способ справиться с этим?
В настоящее время моя лучшая идея - написать препроцессор, который удаляет узлы смарт-тегов.
Редактировать
В продолжение комментария от Синди Мейстер.
Я использую Open Xml версия 2.7.2. Как указала Синди, в Open XML 2.0 есть класс SmartTagRun. Я не знал об этом классе.
Я нашел следующую информацию на странице Что нового в Open XML SDK 2.5 для Office
Смарт-теги
Поскольку смарт-теги в Office 2010 устарели, Open XML SDK 2.5 не поддерживает элементы Open XML, связанные со смарт-тегами. Open XML SDK 2.5 по-прежнему может обрабатывать элементы смарт-тегов как неизвестные элементы, однако средство повышения производительности Open XML SDK 2.5 для Office проверяет эти элементы (см. Следующий список) в файлах документов Office как недействительные теги.
Похоже, что возможным решением было бы использование Open XML 2.0.