0

您好,在此先感谢您,我正在尝试从 silverlight 应用程序中的文本框和单击按钮触发的事件中获取输入,将它们转换为 xml 字符串,将字符串和指定的文件名传递给 WCF 服务调用并在该调用中将 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 块并不表示找不到文件(“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 文档只允许一个对象(因为它将对象名称作为根文档元素,其中只能有一个),那么您将必须具有不同的 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 回答