Прежде всего, я думаю, что с 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);