我有一些包含xml标签和纯文本的单词模板(点/点xx)文件 在运行时,我需要将xml标记替换为各自的邮件合并字段。
因此,需要解析这些xml标记的文档并将其替换为合并字段。 我正在使用Regex来查找和替换这些xml标签。但我被建议使用XML解析器来解析XML标记(Regex for string enclosed in <*>, C#)
现在我已经更好地展示了我的案例, 你能指导一下,如果XML解析器是一个正确的工具来实现上述目标吗? 如果是,我是否需要将word文档保存为xml文件,然后需要解析xml标签?
请指导。
答案 0 :(得分:1)
为什么不使用Word API执行此操作?如果不使用专为此目的设计的API,我无法想象有任何方法可以安全地完成此任务。
答案 1 :(得分:1)
您需要使用Word API。这比你想象的要复杂得多。
Word 2003文件(.doc,dot)以专有的二进制格式存储。通过阅读规范阅读这种格式几乎是不可能的,为此投资SDK或通过COM直接连接到Word来处理处理是非常值得的。
Word 2007文件(.docx,.dotx)确实是XML格式,但.docx文件实际上是一个压缩的文件夹和文件层次结构。为此,OpenXML SDK可以处理.docx,我假设也可以处理它们的等效模板。
2007格式的替代方法是使用Word创建模板,并学习文件的层次结构并适当地处理它们。将.docx或.dotx扩展名更改为.zip,解压缩,并找到find-and-replace标记的位置。您可以只更换标签,重新压缩层次结构并重命名扩展名。
答案 2 :(得分:0)
是的,您可以使用System.Xml.XmlDocument
类来阅读XML源代码。您还需要声明处理该XML内容所需的所有名称空间。
答案 3 :(得分:0)
首先,我认为正则表达式应该没问题。
但如果您真的想使用XML解析器,我喜欢.NET中的XmlDocument / XmlNode。 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);