我需要打开XML文件(创建XmlDocument)而不创建本地副本。使用SSH.NET,我提出了这个代码:
var connectionInfo = new ConnectionInfo("host",
"username",
new PasswordAuthenticationMethod("username", "password"));
using (var client = new SftpClient(connectionInfo))
{
client.Connect();
System.IO.MemoryStream mem = new System.IO.MemoryStream();
client.DownloadFile("filename.xml", mem);
mem.Position=0;
using(XmlReader reader = XmlReader.Create(mem))
{
var docc = new XmlDocument();
docc.Load(mem);
}
client.Disconnect();
}
但是被docc.Load(mem)
困住了。可能是什么问题?
mem
对象如下所示:
答案 0 :(得分:3)
请注意:
using(XmlReader reader = XmlReader.Create(mem))
{
var docc = new XmlDocument();
docc.Load(mem);
}
您根本没有使用变量reader
。要么改为
using(XmlReader reader = XmlReader.Create(mem))
{
var docc = new XmlDocument();
docc.Load(reader);
}
或删除阅读器:
docc.Load(mem);
答案 1 :(得分:1)
虽然@Evk的答案解决了您的问题,但您的代码仍然效率低下。
使用SftpClient.OpenRead
直接将文件流式传输到XmlReader
:
using (XmlReader reader = XmlReader.Create(client.OpenRead("filename.xml"))
{
// process the XML
}
或XmlDocument
:
var docc = new XmlDocument();
docc.Load(client.OpenRead("filename.xml"));
这样,您不会通过在MemoryStream
中创建该文件的另一个副本来浪费内存。
答案 2 :(得分:-1)
试试这个:
using (var client = new SftpClient(connectionInfo))
{
client.Connect();
System.IO.MemoryStream mem = new System.IO.MemoryStream();
client.DownloadFile("filename.xml", mem);
// Set stream position
mem.Position = 0;
using(XmlReader reader = XmlReader.Create(mem))
{
var docc = new XmlDocument();
docc.Load(mem);
}
client.Disconnect();
}
我还会更改代码以正确处理内存流...