【问题标题】:Replacing double backslash with one blackslash not working用一个黑斜杠替换双反斜杠不起作用
【发布时间】:2013-03-12 11:27:41
【问题描述】:

我正忙于创建一个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 字符串我需要传递给另一个方法。

【问题讨论】:

  • 您如何查看字符串? VS 调试器将显示转义的反斜杠,这可能会产生误导。
  • 我调试。我有这个:string xml = xDocument.ToString(); 我复制并粘贴到一个 .xml 文件。我做错了吗?
  • 调试器添加了额外的反斜杠用于显示目的,所以如果你从调试器中剪切和粘贴,你会遇到这个问题!相反,将其写入文件。或者,您可以右键单击调试器中的变量并选择不转义反斜杠的“文本可视化工具”。
  • 我需要将此xml字符串传递给另一个进程。
  • 汽车和本地人也会避开反斜杠。仔细观察显示字符串的右侧,您会看到一个小放大镜。选择它旁边的小下拉箭头,然后点击“Text Visualizer”

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


【解决方案1】:

您正确地替换了反斜杠。

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

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

从“Autos and locals”显示中执行此操作:仔细查看显示字符串的右侧,您会看到一个小放大镜。选择它旁边的小下拉箭头,然后单击“文本可视化器”。这将显示文本而没有额外的反斜杠。

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

【讨论】:

  • 这是真的! :) 感谢您让我们知道那个小放大镜。
【解决方案2】:

我准备了以下示例。请将您的代码的调试值与我提供的进行比较。默认情况下,域名以 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);

【讨论】:

    【解决方案3】:

    我认为问题在于 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>
    

    如您所见,您需要的只有一个\。您可以在此处找到 LinqPadDownload link(如果您想在我使用过的相同环境中试用它,在 LinqPad 中试用代码 sn-ps 通常比在 Visual Studio 中更快因为您不需要先创建项目)。

    更新:我也用 Visual Studio 2010 Ultimate 进行了尝试,看看是否有任何差异。所以我创建了一个控制台应用程序,将xDocument.Dump(); 语句替换为

    string xml = xDocument.ToString();
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-16
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2013-06-24
      • 1970-01-01
      • 2011-09-06
      • 1970-01-01
      相关资源
      最近更新 更多