2009-12-15 13 views
1

У меня есть текстовые шаблоны (dot/dotx), содержащие теги xml вместе с простым текстом.
Во время выполнения мне нужно заменить теги xml соответствующими полями слияния.XML-анализатор для чтения тэгов xml из файла слов C#

Итак, необходимо проанализировать документ для этих тегов xml и заменить их полями слияния. Я использовал Regex, чтобы найти и заменить эти теги xml. Но я предложил использовать XML-анализатор для разбора тегов XML (Regex for string enclosed in <*>, C#)

Теперь, когда я представил мой случай лучше,
могли бы вы, пожалуйста, руководство, если XML-парсер будет правильным инструментом для того чтобы достигнуть выше?
если да, мне нужно сохранить документ слова как XML-файл, а затем нужно проанализировать теги xml?

Просим руководствоваться.

+0

A Вы действительно внедряете пользовательский XML в шаблоны Word? Или вы просто печатаете в текст угловые скобки? Есть разница. Парсер XML не поможет, если вы просто печатаете угловые скобки в тексте документа Word. – CoderDennis

+1

Спасибо Деннис, ну ... это конечные пользователи, которые будут создавать шаблоны, введя эти теги XML, вручную набрав угловые скобки. – iniki

+0

Inutan, вы просто задали этот же вопрос 3 раза, в 3 разных потоках. Это не обязательно. Придерживайтесь одного вопроса. – Cheeso

ответ

1

Почему вы не используете Word API для этого? Я не могу представить, как это сделать безопасно, не используя API, которые были разработаны для этой цели.

+0

Ну, я использую Aspose для вставки полей слияния и не хочу зависеть от какой-либо конкретной версии Word, которая будет установлена ​​на сервере. – iniki

+0

Вы не сказали, что работаете на сервере. Обновите свой вопрос с подробной информацией о своей среде. –

0

Да, вы можете использовать класс System.Xml.XmlDocument для чтения вашего источника XML. Вам также необходимо объявить все пространства имен, необходимые для работы с этим XML-контентом.

1

Вам необходимо использовать Word API. Это сложнее, чем вы думаете.

Файлы Word 2003 (.doc, dot) хранятся в собственном двоичном формате. Чтение этого формата путем чтения спецификации почти невозможно, и для этого стоит инвестировать в SDK или напрямую подключаться к Word через COM для обработки обработки.

Файлы Word 2007 (.docx, .dotx) действительно находятся в XML, но файл .docx на самом деле представляет собой занудочную иерархию папок и файлов, создающих документ на куски. Для этого OpenXML SDK может обрабатывать .docx, и я предполагаю, что он также может обрабатывать свои эквивалентные шаблоны.

Альтернативой для формата 2007 является создание вашего шаблона с использованием Word, а также изучение иерархии файлов и правильное обращение с ними. Измените расширение .docx или .dotx на .zip, unzip и найдите, где находятся теги find-and-replace. Вы можете просто заменить теги, повторно закрепить иерархию и переименовать расширение.

+0

+1 для ссылки OpenXML SDK – CoderDennis

0

Прежде всего, я думаю, что Regex должен быть в порядке.

Но если вы действительно хотите использовать парсер XML, я обожаю XmlDocument/XmlNode в .NET. Две функции SelectSingleNode и SelectNodes бесконечно полезны. К сожалению, у меня нет примера Слово XML передо мной, так что давайте предположим, что этот XML:

<Document> 
    <MergeField name="phone"></MergeField> 
    <MergeField name="email"></MergeField> 
</Document> 

Вы бы затем использовать код следующим образом:

XmlDocument wordDoc = new XmlDocument(); 
wordDoc.Load(fileName); 

XmlNodeList mergeNodes = wordDoc.SelectNodes("//MergeField"); 

foreach(XmlNode mergeNode in mergeNodes) 
{ 
    string fieldName = mergeNode.Attributes["name"].Value; 
    // Do something here based on field name 
    // e.g.: 

    mergeNode.InnerText = GetFieldValue(fielName); 
} 

doc.Save(fileName); 

Хитрость это слово XML использует XML-пространство имена повсюду, так что вам нужно использовать XmlNamespaceManager класса является .NET рассказать документ XML, который является пространством имен, которое, таким образом, было бы больше похоже:

XmlDocument wordDoc = new XmlDocument(); 
wordDoc.Load(fileName); 

XmlNamespaceManager nsm = new XmlNamespaceManager(doc.NameTable); 
nsm.AddNamespace("o", "http://somenamepaceurl.com"); 
XmlNodeList mergeNodes = wordDoc.SelectNodes("//o:MergeField", nsm); 

foreach(XmlNode mergeNode in mergeNodes) 
{ 
    string fieldName = mergeNode.Attributes["name"].Value; 
    // Do something here based on field name 
    // e.g.: 

    mergeNode.InnerText = GetFieldValue(fielName); 
} 

doc.Save(fileName); 
+0

Это не сработает, если его документ не является XML. –

Смежные вопросы