XML解析器从word文件C#读取xml标签

时间:2009-12-15 17:12:30

标签: c# xml ms-word parsing

我有一些包含xml标签和纯文本的单词模板(点/点xx)文件 在运行时,我需要将xml标记替换为各自的邮件合并字段。

因此,需要解析这些xml标记的文档并将其替换为合并字段。 我正在使用Regex来查找和替换这些xml标签。但我被建议使用XML解析器来解析XML标记(Regex for string enclosed in <*>, C#

现在我已经更好地展示了我的案例, 你能指导一下,如果XML解析器是一个正确的工具来实现上述目标吗? 如果是,我是否需要将word文档保存为xml文件,然后需要解析xml标签?

请指导。

4 个答案:

答案 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);