2010-04-02 57 views
1

我想通過將它們作爲Java類的靜態最終字符串變量存儲,並引用或靜態導入它們,將它們用作XML,字符串,方法,註釋等中的值來強制執行標準化的鍵。如何在XML文件中利用字符串常量?

有誰知道一個好的方法,讓Maven插入(如過濾)像StringKeys.SOME_KEY值到一個XML文件?例如像

<element value="${StringKeys.SOME_KEY}"/> 

或類似的 - 主要想法是強制通用性和防止關鍵失準。或者一種替代解決方案來實現 - 用一些語義來說,如果一個不存在的字符串被引用,它在構建過程中會失敗?如果它在C#中工作,也可以獲得獎勵積分。

+0

你想比過濾別的東西,對不對? – 2010-04-02 21:07:19

+0

是的 - 因爲我希望令牌的來源位於Java類中 - 理想情況下更接近EL評估的東西,但這會代替 – jayshao 2010-04-02 21:16:10

回答

1

您可以使用XSLT生成您的POM,大概是指你可以用下面的

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:dyn="http://exslt.org/dynamic" extension-element-prefixes="dyn" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:masterrule="com.Xxxxxx.ClassName" exclude-result-prefixes="masterrule #default"> 

<xsl:value-of select="masterrule:xxxxx"/> 
+0

這看起來很有前途(雖然不知道我是否將它用於POM,更可能是我們試圖生成的XML配置文件,根據上面的問題) - 有更多示例的URL? – jayshao 2010-04-09 01:13:34

2

您可以使用XSLT並使用EL表達式擴展字符串。

+0

確實,您是否知道一種簡單的方法將其綁定到構建或其他過程中? (和*最好是* C#) – jayshao 2010-04-02 21:20:34

+0

困難的部分是獲取對象。Java回調機制是變壓器特定的(例如java命名空間)。 – 2010-04-03 07:18:56

+0

是的,總體來說,我使用了相當多的XSLT,我認爲它是 – jayshao 2010-04-06 15:19:59

1

有時使用字符串常量比它的價值更麻煩。國際海事組織就是這樣一個例子。

但是,如果你想追求這一點,這裏有一些想法,可能會爲你工作:

  1. 使用Java DOM庫建立在內存中的XML,使用Java常量。

  2. 將常量放入一個Properties對象中,然後使用Velocity,Freemarker或等效的Java兼容模板語言創建一個XML文件模板,該模板語言將屬性值擴展到XML中。

    2a。在某些情況下,可以使用JSP代替通用的Java兼容模板語言。

  3. 使用指定常量的佔位符生成XML,然後使用XSLT將佔位符替換爲實際值。

但在每一種情況下,你才能使用命名常量採取的步驟導致的脆弱性在其他領域,何況更多的代碼和額外的處理。這使我回到了我原來的觀點......

編輯我認爲沒有真正的好解決方案的真正原因是它是一個非常難的問題。

爲了演示,使用JSP生成XML(和規範)將確保您只使用有效的Java常量,並且對於生成的Java類而言具有快速故障轉移功能。但是,JSP方法並不能保證您生成格式良好的XML。

問題的根源在於,您需要在XML模板中嵌入Java構造的表現力,並結合靜態檢查模板的Java和XML方面的良構。您確實需要適當的語言支持,但實際上可用的解決方案只是輸出字符而不考慮(在本例中)XML語法規則。

+0

雖然我傾向於同意你的看法,但如果從頭開始這樣做的話,我希望有人已經有了一個可靠的,快速的模板替換,它可以與Maven連接起來 - 因爲它已經被燒燬了我們幾次已經 – jayshao 2010-04-05 15:15:57

0

速度或類似是你最好的選擇,但它需要編寫你自己的插件。

我通常會在另一個方向上做這些 - 將鍵和值存儲在屬性文件中,並將其過濾到XML中,並將它們讀入Java/C#類中。你可以在我們的書中的免費樣章中找到一個例子:http://brettporter.wordpress.com/2009/09/30/apache-maven-2-effective-implementation-sample-chapter/

+0

所以一個屬性文件讓你幹 - 你怎麼防止從屬性文件中拉空白字段? – jayshao 2010-04-09 01:14:09

+0

我不完全確定你的意思是在這裏。你想能夠設置默認值可以替換嗎? – 2010-04-12 06:46:29

1

你不能使用XML枚舉限制字符串嗎?

<xsd:restriction base = "xsd:string"> 
    <xsd:enumeration value = "AUD"/><!-- Australian Dollar --> 
    <xsd:enumeration value = "BRL"/><!-- Brazilian Real --> 
    <xsd:enumeration value = "CAD"/><!-- Canadian Dollar --> 
</xsd:restriction> 
+0

雖然這並不真正讓我獲得與靜態常量字符串相同的用法 - 例如我想要的是使用編譯器爲我測試這個並且不會破壞密鑰 – jayshao 2010-04-09 01:12:31

+0

您可以使用xsd.exe [或java中的JAXB]生成一個C#[java]枚舉。 – Fakrudeen 2010-04-12 06:49:14

相關問題