用一个反斜杠替换双反斜杠不起作用

时间:2013-03-12 11:27:41

标签: c# .net xml linq-to-xml

我正忙着创建一个XDocument对象。在其中一个元素中,我需要添加域名和服务帐户。服务帐户的内容如下:

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字符串传递给另一个方法。

3 个答案:

答案 0 :(得分:2)

您正在更换反斜杠。

但是,当您在Visual Studio调试器中查看结果时,它会转义反斜杠(添加额外的反斜杠),这会让您觉得它不起作用。

要在调试器中查看实际字符串,必须使用“Text Visualizer”。

要从“Autos and locals”显示中执行此操作:仔细查看显示字符串的右侧,您会看到一个小放大镜。选择旁边的小滴箭头,然后单击“Text Visualizer”。这将显示文本,不带额外的反斜杠。

如果从Quickwatch中查看变量(右键单击变量并选择“Quickwatch”),也可以执行此操作。将出现带有放置箭头的相同小放大镜图标,您可以单击放下箭头并选择“Text Visualizer”。

答案 1 :(得分:0)

我准备了以下示例。请将您的代码的调试值与我提供的调试值进行比较。默认情况下,域名会以您希望的“域\用户名”格式保存在XML中。

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

答案 2 :(得分: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();
    serviceAccount.DomainServiceAccount=@"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>

如您所见,您只需要一个\即可拥有它。你可以在这里找到 LinqPad Download link(如果你想在我使用的相同环境中试用它,在LinqPad中试用代码片段通常比在Visual Studio中试用更快因为你不需要先创建一个项目。

更新:我已经尝试使用 Visual Studio 2010 Ultimate 来查看是否存在任何差异。所以我创建了一个控制台应用程序,用

替换了xDocument.Dump();语句
string xml = xDocument.ToString();

并在那里创建了一个断点 - 正如你所做的那样。当达到断点时,我已经在XML可视化工具中查看了xml字符串,并获得了与LinqPad相同的结果(如上所示)。文本可视化工具显示相同的结果(只有一个反斜杠)。