2013-03-12 54 views
1

我正忙於創建一個XDocument對象。在我需要添加域名和服務帳戶的1個元素中。該服務帳戶來如:用一個黑色槓桿替換雙反斜槓不起作用

MyDomainName\\MyServiceAccount 

我需要的標籤,看起來像:

<ChangeRunAsName>MyDomainName\MyServiceAccount</ChangeRunAsName> 

不要緊,我如何嘗試更換\\\,它仍然出來爲\\

這是我目前有:

XDocument xDocument = new XDocument(
    new XDeclaration("1.0", "utf-8", null), 
    new XElement("MyAppsTable", 
      myApplications.Select(component => new XElement("MyApps", 
       new XElement("ChangeResult", string.Empty), 
       new XElement("ChangeRunAsName", serviceAccount.DomainServiceAccount.Replace("\\\\", "\\") 
     )) 
    ) 
); 

的myApplications和serviceAccount輸入參數是這樣的:

IEnumerable<MyApplication> myApplications 
ServiceAccount serviceAccount 

我曾嘗試以下:

serviceAccount.DomainServiceAccount.Replace("\\\\", "\\") 
serviceAccount.DomainServiceAccount.Replace(@"\\", @"\") 

.. 。它仍然是:

<ChangeRunAsName>MyDomainName\\MyServiceAccount</ChangeRunAsName> 

我不知道該做什麼了。

我有這樣上面的代碼之後:

string xml = xDocument.ToString(); 

調試時我看到XML的內容,然後我看到\\\。這個xml字符串我需要傳遞給另一個方法。

+1

你是如何查看字符串的? VS調試器將顯示逃逸的反斜槓,這可能會引起誤解。 – 2013-03-12 11:34:13

+0

我調試。我有這個:'string xml = xDocument.ToString();'這個我複製並粘貼到一個.xml文件。我做錯了嗎? – 2013-03-12 11:35:41

+0

調試器爲顯示目的放置額外的反斜槓,所以如果你從調試器中剪切並粘貼,你會遇到這個問題!相反,將其寫入文件。或者,您可以右鍵單擊調試器中的變量,然後選擇不會跳過反斜槓的「文本可視化器」。 – 2013-03-12 11:37:24

回答

0

我準備了下面的例子。請將您的代碼的調試值與我提供的代碼進行比較。默認情況下,域名將以XML保存,如「domain \ username」格式所示。

XDocument xdoc = new XDocument(); 
xdoc.Add(new XElement("user",System.Security.Principal.WindowsIdentity.GetCurrent().Name)); 
xdoc.Save(@"d:\test.xml",SaveOptions.None); 
0

我認爲問題是如何實現DomainServiceAccount。因爲你沒有發佈這個細節,我已經取得了一些假設,如下

class MyApplication { public ServiceAccount component { get; set; } } 
class ServiceAccount { public string DomainServiceAccount { get; set; } } 

然後我在LinqPad創建了下面的代碼定義缺少類:

static void Main() 
{ 
    IEnumerable<MyApplication> myApplications= 
     new System.Collections.Generic.List<MyApplication>(); 
    ServiceAccount serviceAccount=new ServiceAccount(); 
    [email protected]"test\\account"; 
    ((List<MyApplication>)myApplications).Add(new MyApplication() { 
     component=serviceAccount }); 
    XDocument xDocument = new XDocument(
     new XDeclaration("1.0", "utf-8", null), 
     new XElement("MyAppsTable", 
       myApplications.Select(component => new XElement("MyApps", 
        new XElement("ChangeResult", string.Empty), 
        new XElement("ChangeRunAsName", 
         serviceAccount.DomainServiceAccount.Replace("\\\\", "\\")) 
        ) 
       ) 
     ) 
    ); 
    xDocument.Dump(); 
} 

這將產生以下輸出:

<MyAppsTable> 
    <MyApps> 
    <ChangeResult></ChangeResult> 
    <ChangeRunAsName>test\account</ChangeRunAsName> 
    </MyApps> 
</MyAppsTable> 

正如你所看到的,只有一個\,你需要擁有它。你可以在這裏找到LinqPadDownload link(如果你想在我使用過的相同環境中試用它,通常在LinqPad中比在Visual Studio中更快地嘗試代碼片斷,因爲你不需要創建一個項目第一)。

更新:我已經嘗試過了與的Visual Studio 2010旗艦版還有,看看是否有任何差異。所以,我創建了一個控制檯應用程序,取代了xDocument.Dump();語句

string xml = xDocument.ToString(); 

,並創建一個斷點 - 當你做到了。當中斷點被擊中時,我查看了XML可視化器中的xml字符串,並得到了與LinqPad相同的結果(如上所示)。文本可視化器顯示相同的結果(只有一個反斜槓)。

2

您正確更換反斜槓。

但是,當您在Visual Studio Debugger中查看結果時,它會轉義反斜槓(添加額外的反斜槓),這會給您帶來無法工作的印象。

要在調試器中看到實際的字符串,您必須使用「文本可視化器」。

要從「汽車和本地人」的顯示屏上執行此操作:仔細查看顯示的字符串的右側,您會看到一個小放大鏡。選擇旁邊的小箭頭,然後點擊「Text Visualizer」。這將顯示文本而不是其他反斜槓。

如果您從Quickwatch中查看變量(您右鍵單擊變量並選擇「Quickwatch」),也可以執行此操作。同樣的小放大鏡圖標旁邊會出現一個下拉箭頭,您可以點擊下拉箭頭並選擇「Text Visualizer」。

+0

這是真的! :)謝謝你讓我們知道那個小放大鏡。 – 2014-10-25 01:13:46

相關問題