2009-12-15 415 views
1

我有一些包含xml標籤和純文本的文字模板(點/點)文件。
在運行時,我需要用它們各自的郵件合併字段替換xml標記。XML解析器從Word文件中讀取xml標籤C#

因此,需要爲這些XML標籤解析文檔並用合併字段替換它們。 我正在使用正則表達式來查找和替換這些XML標籤。但我建議使用XML解析器的XML標記(Regex for string enclosed in <*>, C#

現在解析我已經提出了我的情況比較好,
請您指導,如果XML解析器將以上才達到一個合適的工具?
如果是,我是否需要將word文檔保存爲xml文件,然後需要解析xml標籤?

請指導。

+0

一是否實際上將自定義XML嵌入到Word模板中?或者你只是在文本中輸入尖括號?它們是有區別的。如果您只是在Word文檔的文本中輸入尖括號,則XML解析器將無濟於事。 – CoderDennis 2009-12-15 17:45:44

+1

感謝Dennis,好吧......最終用戶將通過手動輸入尖括號來輸入這些XML標籤來創建模板。 – iniki 2009-12-15 21:10:16

+0

Inutan,你只是在3個不同的線程中問了同樣的問題3次。這沒有必要。堅持一個問題。 – Cheeso 2009-12-15 21:40:30

回答

1

爲什麼不使用Word API來做到這一點?我無法想象有任何方法可以在不使用專爲此目的而設計的API的情況下安全地執行此操作。

+0

那麼,我使用Aspose來插入合併字段,並且不希望依賴於要安裝在服務器上的任何特定版本的Word。 – iniki 2009-12-15 17:16:22

+0

你沒有說你在服務器上運行。請更新你的問題與你的環境的細節。 – 2009-12-15 17:41:40

0

是的,您可以使用System.Xml.XmlDocument類來讀取您的XML源代碼。您還需要聲明處理該XML內容所需的所有命名空間。

1

您需要使用Word API。這比你想象的更復雜。

Word 2003文件(.doc,dot)以專有二進制格式存儲。通過閱讀規範來閱讀這種格式幾乎是不可能的,爲此投資於SDK或通過COM直接連接Word來處理處理是非常值得的。

Word 2007文件(.docx,.dotx)的確在XML中,但.docx文件實際上是一個文件夾和文件的壓縮文件。爲此,OpenXML SDK可以處理.docx,我假設也可以處理它們的等效模板。

2007格式的替代方法是使用Word創建您的模板,並學習文件的層次結構並適當地處理它們。將.docx或.dotx擴展名更改爲.zip,解壓縮並查找您的查找和替換標籤所在的位置。您可能只需更換標籤,重新編碼摺疊並重命名擴展。

+0

適用於OpenXML SDK的+1鏈接 – CoderDennis 2009-12-15 17:35:21

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); 
+0

除非他的文檔是XML,否則這不起作用。 – 2009-12-15 17:42:47