0

こんにちは。その呼び出しで、xmlを指定されたファイルに(文字列パラメーターを介して)保存します。テキストをxml文字列にキャプチャするコードは、正常に機能しているようで(デバッグ時に変数に表示される内容に基づく)、次のようになります。

    private void ServerInfoNext_Click(object sender, RoutedEventArgs e)
                {

                    //new RegisterServerGroupObject instance
                    RegisterServerGroupObject groupInfo= new RegisterServerGroupObject(groupNameTB.Text,1,parentServerNameTB.Text,LeaderNameCB.SelectedItem.ToString());

                    var serializer = new XmlSerializer(typeof(RegisterServerGroupObject));
                    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
                    ns.Add("","");

                    XmlWriterSettings settings = new XmlWriterSettings();
                    settings.Encoding = Encoding.UTF8;
                    settings.Indent = true;
                    settings.CloseOutput = true;

                    StringBuilder sb = new StringBuilder();

                    using (XmlWriter writer = XmlWriter.Create(sb,settings))
                    {
                        serializer.Serialize(writer, groupInfo);
                        writer.Close();
                    }

                    //sb now contains the xml string with the information from the serialized class
                    string contentsString = sb.ToString();
                    //create instance of XmlWrite service
                    XMLWriteServiceClient xmlClient = new XMLWriteServiceClient();
                    xmlClient.WriteXmlToServerCompleted += new EventHandler<System.ComponentModel.AsyncCompletedEventArgs>(xmlClient_WriteXmlToServerCompleted);
                    xmlClient.WriteXmlToServerAsync("ServerGroups.xml", contentsString);
    }

この時点で、変数の内容の文字列がサービスメソッドに渡されると、有効なxmlがあり、サービスメソッド自体の中に次のようになっていることがわかります。

public class XMLWriteService : IXMLWriteService
    {
        public void WriteXmlToServer(string filename,string xmlString)
        {
            XmlDocument xDoc = new XmlDocument();
            xDoc.LoadXml(xmlString.ToString());


            try
            {
                xDoc.Save(filename);


            }
            catch (FileNotFoundException e)
            {

                Console.WriteLine(e.InnerException.ToString());
            }
        }
    }

try / catchブロックは、file( "ServerGroups.xml")が見つからないことを示していません。現在、プロジェクトのサーバー側部分のClientBinにそのxmlファイルがあります。(.Web側)。ただし、メソッドが終了した後、ファイルに書き込まれる新しいxmlはありません。誰かが私が間違っていることを教えてもらえますか?XmlDocumentクラスインスタンスがその内容をファイルに保存しない理由がわかりません。前もって感謝します!

4

2 に答える 2

2

パスを渡さないので、ファイルがWCFサービスプロセスの現在のディレクトリに保存されます。それが何であるかを調べるか、サーバードライブ全体でそのファイル名を検索して、ファイルが保存されている場所を確認します。さらに良いことに、ファイルに保存する前に、を呼び出しPath.Combineてファイル名の先頭へのパスを追加します。例えば:

xDoc.Save(Path.Combine("C:\\ClientBin", filename));

以下のコメントで質問に答えるために、サーバー上のXMLファイルに既に保存されているデータに着信XMLデータを追加する場合は、もう少し複雑になります。それはすべて、XMLの形式によって異なります。シリアル化を使用しているため、デフォルトではXMLドキュメントごとに1つのオブジェクトしか許可されません(オブジェクト名がルートドキュメント要素として配置され、そのうちの1つしか存在できないため)。その場合は、別のXML形式を使用する必要があります。RegisterServerGroupObjectたとえば、サーバー側では、受信オブジェクトを追加し続けることができる、ドキュメント上にある種のルート要素が必要になります。たとえば、サーバー上のXMLファイルが次のようになっている場合:

<?xml version="1.0" encoding="utf-8" ?>
<ListOfRegisterServerGroupObject>
</ListOfRegisterServerGroupObject>

次に、次のように、そのルート要素内に新しい要素を挿入してデータを追加できます。

<?xml version="1.0" encoding="utf-8" ?>
<ListOfRegisterServerGroupObject>
    <RegisterServerGroupObject>
        ...
    </RegisterServerGroupObject>
    <RegisterServerGroupObject>
        ...
    </RegisterServerGroupObject>
    ...
</ListOfRegisterServerGroupObject>

これを行うには、最初にXMLドキュメントをロードし、次にルート要素を取得してから、着信XMLを子要素として追加する必要があります。例えば:

public void WriteXmlToServer(string filename, string xmlString)
{
    string filePath = Path.Combine("C:\\ClientBin", filename);
    XmlDocument storage = New XmlDocument();
    storage.Load(filePath); 
    XmlDocument incoming = New XmlDocument();
    incoming.LoadXml(xmlString);
    storage.DocumentElement.AppendChild(incoming.DocumentElement);
    storage.Save(filePath);
}
于 2012-08-20T14:10:57.357 に答える
1

サービス内の出力ファイルに物理パスを「マッピング」する必要がある場合があります

文字列パス=HostingEnvironment.MapPath( "〜/ MyPath / MyFile.xml");

于 2012-08-20T14:17:00.667 に答える