Поиск по тегу 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><!TAG1</w:t>
</w:r>
<w:proofErr w:type="gramEnd"/>
<w:r>
<w:rPr>
<w:lang w:val="en-GB"/>
</w:rPr>
<w:t>!></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>
С наилучшими пожеланиями, Майк