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

4

3 回答 3

2

You are correctly replacing the backslashes.

However, when you view the results in the Visual Studio Debugger, it is escaping the backslashes (adding extra backslashes) which is giving you the impression that it didn't work.

To see the actual string in the debugger, you must use the "Text Visualizer".

To do so from the "Autos and locals" display: Look closely to the right of the displayed string and you'll see a little magnifying glass. Select the little drop arrow next to it then click "Text Visualizer". This will display the text without additional backslashes.

You can also do this if you view the variable from Quickwatch (where you right-click a variable and select "Quickwatch"). The same little magnifying glass icon with a drop arrow next to it will appear, and you can click the drop arrow and select "Text Visualizer".

于 2013-03-13T11:19:05.897 回答
0

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

XDocument xdoc = new XDocument();
xdoc.Add(new XElement("user",System.Security.Principal.WindowsIdentity.GetCurrent().Name));
xdoc.Save(@"d:\test.xml",SaveOptions.None);
于 2013-03-12T12:05:11.750 回答
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下载链接(如果你想在我使用过的相同环境中试用它,在 LinqPad 中试用代码片段通常比在 Visual Studio 中更快,因为你不需要创建项目第一的)。

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

string xml = xDocument.ToString();

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

于 2013-03-12T12:05:32.160 回答