2013-06-05 32 views
4

我正在嘗試在我的項目中使用xml配置文件。現在,它看起來像:XML配置中的變量

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 

    <configSections> 
    <section name="replication" type="Project.Replication.ReplicationConfigSection, Project.Replication" /> 
    <section name="processing" type="Project.Processing.ProcessingConfigSection, Project.Processing" /> 
    </configSections> 

    <replication> 
    <streams> 
     <stream name="STREAM_DATA_14360" /> 
    </streams> 
    </replication> 

    <processing dataStream="STREAM_DATA_14360" /> 

</configuration> 

它的工作原理確定,但我很困惑,在它("STREAM_DATA_14360")重複。

您能否提醒我,如何在XML中創建變量或重新使用數據以便在應用程序配置中可以接受?

UPDATE:

在現實生活中我的配置有更多的部分。有一個價值,這在許多部分apeears:STREAM_DATA_14360。所以我想只能在配置文件的一個地方更改此值,並在其他地方使用對其的引用。

改變配置的速度 - 是它的第一個原因。

文件的大小是第二,因爲值可以是巨大的:STREAM_INFO_FUTURE_SESSION_CONTENTS_12421(即第三方名稱)

+1

屬性名稱不同,節點名稱也不同,所以它們不重複。 –

+1

有很好的工具來創建自定義配置部分:配置部分設計器:https://csd.codeplex.com/ – Giedrius

+0

@WimOmbelets所以,如果我在不同部分有幾十個相同的字符串 - 它們都不是重複的?好的,你能告訴我如何在xml文件的一個地方執行這個「不重複」的快速更改嗎? – astef

回答

1

您可以直接在<appSettings>和訪問添加該值正如你所說的那樣。

你可以做到這一點,如下:

<appSettings> 
    <add key="StreamName" value="STREAM_DATA_14360"/> 
</appSettings> 

在代碼中,你可以如下訪問:

string streamName = ConfigurationManager.AppSettings["StreamName"]; 

確保使用此之前添加引用System.Configuration組裝。

+0

是的,甚至更好。 '全球'部分是我不必要的發明=) – astef

+0

@astef是的,爲什麼要重新發明輪子 –

0

除了使用外部的代碼,可能(也可能不會)方便你的生活,你可以定義您自己的類繼承自ConfigurationSection,其中您定義並封裝了您的鍵/值對並使用ConfigurationProperty屬性。

有關於的更多信息,請參閱http://msdn.microsoft.com/en-us/library/2tw134k3.aspx如何使用ConfigurationSection創建自定義配置部分

編輯:你可以在XSD引用(檢查here

+0

已經創建了'ConfigurationSections'('ReplicationConfigSection'和'ProcessingConfigSection')。我無法理解,它是如何與xml中的字符串重複相關的。 – astef

+0

xsd不能用作System.configuration文件,不是嗎? – astef

1

XML沒有任何本地擴展宏或模板 - 情景任何會要求你做一個預處理步驟或有讀取代碼配置涉及代替價值。

如果這些沒有被編輯的名字,但似乎一個簡單的搜索/替換可以解決這個問題,而沒有太多關於誤報的問題。

你可以把T4 templates作爲一個預處理器,不管這個值是否真的取決於你希望修改這個文件的頻率。

也應該可以將web.config transformation引擎用來替換,但您可能必須爲XDT engine編寫一些託管代碼,具體取決於您的配置文件的設置方式。

0

感謝您的回答。我同意Mark的觀點,不支持XML中的變量或引用。但是,在我的情況下,有更簡單的解決方案。我現在覺得很蠢,但是希望它能幫助另一個慢點。

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 

    <configSections> 
    <section name="global" type="Project.GlobalConfigSection, Project" /> 
    <section name="replication" type="Project.Replication.ReplicationConfigSection, Project.Replication" /> 
    <section name="processing" type="Project.Processing.ProcessingConfigSection, Project.Processing" /> 
    </configSections> 

    <global> 
    <streamNames> 
     <streamName name="STREAM_DATA_14360" id="1"/> 
    </streamNames> 
    </global> 

    <replication> 
    <streams> 
     <stream nameId="1" /> 
    </streams> 
    </replication> 

    <processing dataStreamId="1" /> 

</configuration> 

後果:需要編輯代碼使用全局節所有長名稱的來源

優勢:快速重命名,值的可重用性