我正忙着创建一个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字符串传递给另一个方法。
答案 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相同的结果(如上所示)。文本可视化工具显示相同的结果(只有一个反斜杠)。