Поиск по тегу OpenXML

Я пишу .NET-приложение, которое должно читать файл .docx длиной около 200 страниц (через DocumentFormat.OpenXML 2.5), чтобы найти все вхождения определенных тегов, которые должен содержать документ. Чтобы было ясно, я не ищу теги OpenXML, а скорее теги, которые должны быть установлены в документе автором документа в качестве заполнителя для значений, которые мне нужно заполнить на втором этапе. Такие теги должны быть в следующем формате:

 <!TAG!>

(где TAG может быть произвольной последовательностью символов). Как я уже сказал, я должен найти все вхождения таких тегов, а также (если возможно) найти «страницу», где был найден тег. Я обнаружил, что что-то просматривает в Интернете, но не раз базовый подход заключался в том, чтобы выгрузить все содержимое файла в строку и затем заглянуть внутрь такой строки независимо от кодировки .docx. Это либо приводило к ложному срабатыванию, либо к отсутствию совпадения (хотя тестовый файл .docx содержит несколько тегов), другие примеры, вероятно, немного превышали мои знания OpenXML. Шаблон регулярных выражений для поиска таких тегов должен быть примерно таким:

<!(.)*?!>

Тег можно найти по всему документу (внутри таблицы, текста, абзаца, а также верхнего и нижнего колонтитула).

Я пишу в Visual Studio 2013 .NET 4.5, но могу вернуться, если потребуется. Постскриптум Я бы предпочел код без использования Office Interop API, поскольку на целевой платформе не будет работать Office.

Наименьший пример .docx, который я могу создать, хранит это внутри документа

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:document xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" mc:Ignorable="w14 w15 wp14">
<w:body>
<w:p w:rsidR="00CA7780" w:rsidRDefault="00815E5D">
  <w:pPr>
    <w:rPr>
      <w:lang w:val="en-GB"/>
    </w:rPr>
  </w:pPr>
  <w:r>
    <w:rPr>
      <w:lang w:val="en-GB"/>
    </w:rPr>
    <w:t>TRY</w:t>
  </w:r>
</w:p>
<w:p w:rsidR="00815E5D" w:rsidRDefault="00815E5D">
  <w:pPr>
    <w:rPr>
      <w:lang w:val="en-GB"/>
    </w:rPr>
  </w:pPr>
  <w:proofErr w:type="gramStart"/>
  <w:r>
    <w:rPr>
      <w:lang w:val="en-GB"/>
    </w:rPr>
    <w:t>&lt;!TAG1</w:t>
  </w:r>
  <w:proofErr w:type="gramEnd"/>
  <w:r>
    <w:rPr>
      <w:lang w:val="en-GB"/>
    </w:rPr>
    <w:t>!&gt;</w:t>
  </w:r>
</w:p>
<w:p w:rsidR="00815E5D" w:rsidRPr="00815E5D" w:rsidRDefault="00815E5D">
  <w:pPr>
    <w:rPr>
      <w:lang w:val="en-GB"/>
    </w:rPr>
  </w:pPr>
  <w:r>
    <w:rPr>
      <w:lang w:val="en-GB"/>
    </w:rPr>
    <w:t>TRY2</w:t>
  </w:r>
  <w:bookmarkStart w:id="0" w:name="_GoBack"/>
  <w:bookmarkEnd w:id="0"/>
</w:p>
<w:sectPr w:rsidR="00815E5D" w:rsidRPr="00815E5D">
  <w:pgSz w:w="11906" w:h="16838"/>
  <w:pgMar w:top="1417" w:right="1134" w:bottom="1134" w:left="1134" w:header="708" w:footer="708" w:gutter="0"/>
  <w:cols w:space="708"/>
  <w:docGrid w:linePitch="360"/>
</w:sectPr>
</w:body>
</w:document>

С наилучшими пожеланиями, Майк

Ответы на вопрос(2)

Ваш ответ на вопрос