2014-02-12 237 views
-2

背景:我的工作中沒有處理很多XML處理。但是,我目前的工作需要我閱讀並將一些媒體轉換爲大小爲10s到100s的大型XML文件。XML文件轉換

要求:這些XML文檔具有我需要更改爲僞ID的用戶ID。這些用戶到僞造ID的映射在單獨的文件中給出。

我會做什麼:通常情況下,我會做的是讀取整個文件,建立一個DOM樹,然後通過樹中的節點遞歸併將用戶ID更改爲僞造的ID,因爲我去和最後傾倒整個文檔到最後。

我的問題:有沒有比這個傳統模型更清潔的技術,如XSLT,XPath等?因爲我將使用.NET框架進行開發,如果我可以在.NET和C#的上下文中獲得答案,那麼這將非常有用。

道歉,如果這聽起來像一個noob問題。過去我從未使用基於XML的技術。我想每個人都需要從某個地方開始,這是我的提示! :)

回答

1

聽起來像XSLT可能會伎倆。使用XSLT,您可以創建一個包含所有代碼和用戶僞造ID映射的樣式表。您將有一個將替換應用於所有用戶ID的功能。要學習XSLT的處事方式(XML語法,功能範式,學習XPath)需要一點工作,但是如果你有時間的話,這對於這個和其他的XML任務來說是有用的。

在.net中,使用XSLT referencetransformation classes來完成您的工作。你的C#代碼將是最小的,所有的邏輯都將在你的XSL變換樣式表中(作爲參數傳遞的.xsl文件)。請記住使用XSLCompiledTransform,因爲速度更快。

+0

嗨@ArthurChamz-感謝您的回答和指針。就像我在上面對我的評論中所說的那樣,嵌入一個包含所有數據的樣式表是不可能的,因爲可能會有數千個ID隨時產生新的ID。就像C#中的回調函數,每次找到與模板匹配的新XML元素時都會調用該函數,這實際上更符合我的想法。是這樣的可能嗎? – Sandman

+0

@Sandman不客氣。如果生成的ID文件是XML,那麼您可以從XSL樣式表中訪問或「嵌入」(無論哪種方式更適合您)生成的文件,並從那裏轉換另一個XML。看到這篇文章:http://stackoverflow.com/questions/4703312/including-an-xml-file-in-an-xml-xsl-file – ArthurChamz

+0

謝謝@ArthurChamz。我會看一看。接受你的答案。 – Sandman

1

這是一個完全標準的XSL要求。如果可以將映射名稱嵌入到樣式表中,則可以使用命令行msxsl.exe來對其進行原型設計。然後,變換將以不同程度的效率應用所需的映射來僞造數據。

如果名稱全部存儲在衆所周知的元素(或屬性)中,則以標識轉換開始,並引入其他模板以映射文檔中出現的名稱。

+0

嗨@ Pekka-謝謝你的回答。您提到將映射嵌入到樣式表中;但是我不認爲在我的情況下這將是可能的,因爲可能會有數千個ID和不斷增加的新ID。我正在考慮類似C#中的回調函數,每次找到匹配模板的新XML元素時都會調用它。這在某種意義上可以幫助我定義變換需要查找或計算的變換,就像我的情況一樣。你認爲XSLT或其他相關的XML技術可以做到這樣嗎? – Sandman

+0

您可以將ID作爲參數傳入您的樣式表,使它們遠離應用程序的靜態部分。或者,您也可以使用'document()'函數或CLR擴展函數。 – Pekka