XML Parser для чтения тегов XML из файла слова C # - PullRequest
1 голос
/ 15 декабря 2009

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

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

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

Пожалуйста, руководство.

Ответы [ 4 ]

1 голос
/ 15 декабря 2009

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

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

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

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

1 голос
/ 15 декабря 2009

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

0 голосов
/ 15 декабря 2009

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

Но если вы действительно хотите использовать синтаксический анализатор XML, я люблю XmlDocument / XmlNode в .NET. Две функции SelectSingleNode и SelectNodes бесконечно полезны. К сожалению, у меня нет примера Word 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);

Сложность в том, что Word 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 голосов
/ 15 декабря 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...