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

バックスラッシュを正しく置き換えています。

ただし、Visual Studio Debugger で結果を表示すると、バックスラッシュがエスケープされている (余分なバックスラッシュが追加されている) ため、機能していないという印象を受けます。

デバッガーで実際の文字列を表示するには、「テキスト ビジュアライザー」を使用する必要があります。

「Autos and locals」ディスプレイからこれを行うには: 表示された文字列の右側をよく見ると、小さな虫眼鏡が表示されます。その横にある小さなドロップ矢印を選択し、[テキスト ビジュアライザー] をクリックします。これにより、追加のバックスラッシュなしでテキストが表示されます。

クイックウォッチ (変数を右クリックして [クイックウォッチ] を選択) から変数を表示する場合にも、これを行うことができます。隣にドロップ矢印が付いた同じ小さな虫眼鏡アイコンが表示され、ドロップ矢印をクリックして「テキストビジュアライザー」を選択できます。

于 2013-03-13T11:19:05.897 に答える
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>

ご覧のとおり、\必要なものは 1 つだけです。LinqPadはここにあります:ダウンロード リンク(私が使用したのと同じ環境で試してみたい場合は、プロジェクトを作成する必要がないため、Visual Studio よりも LinqPad でコード スニペットを試す方が通常は迅速です)最初)。

更新: Visual Studio 2010 Ultimateでも試して、違いがあるかどうかを確認しました。だから私はコンソールアプリケーションを作成し、xDocument.Dump();ステートメントを次のように置き換えました

string xml = xDocument.ToString();

あなたがやったように、そこにブレークポイントを作成しました。ブレークポイントに到達したとき、XML ビジュアライザーで xml 文字列を表示したところ、LinqPad と同じ結果が得られました (上記を参照)。テキスト ビジュアライザーは同じ結果を示しました (バックスラッシュが 1 つだけあります)。

于 2013-03-12T12:05:32.160 に答える
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 に答える