2017-11-30 3 views
3

Ich brauche XML-Datei zu öffnen (XmlDocument erstellen), ohne lokale Kopie zu erstellen. Mit SSH.NET, kam ich mit diesem Code auf:Wie kann ich eine XML-Datei über SFTP herunterladen und öffnen?

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(); 
} 

Aber ist wird auf docc.Load(mem) stecken. Was könnte das Problem sein?

mem Objekt sieht wie folgt aus:

enter image description here

+2

Beachten Sie, dass Ihr 'XmlReader' nicht verwendet wird. Entweder 'docc.Load (reader);' oder xml reader überhaupt entfernen. – Evk

+0

@Evk das war ein wirklich dummer Fehler von meiner Seite, der zu 'docc.Load (reader) wechselte', behob das Problem. Bitte post als Antwort, damit ich akzeptieren kann. – nicks

Antwort

3

Hinweis zu entsorgen:

using(XmlReader reader = XmlReader.Create(mem)) 
{ 
    var docc = new XmlDocument(); 
    docc.Load(mem); 
} 

Sie sind nicht Verwenden der Variablen reader überhaupt. Entweder Änderung

using(XmlReader reader = XmlReader.Create(mem)) 
{ 
    var docc = new XmlDocument(); 
    docc.Load(reader); 
} 

oder Leser entfernen überhaupt:

docc.Load(mem); 
0

Es sieht aus wie Sie XML-Datei geschrieben und jetzt zu streamen, wird Strom am Ende der XML-Datei hingewiesen. Versuchen Sie, stream.position vor dem Laden auf 0 zu setzen.

stream.Position = 0; 
+0

siehe bitte bearbeiten – nicks

-1

Try this:

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(); 
} 

Ich würde auch den Code ändern, um den Speicher-Stream richtig ... das hier

+0

hat nichts geändert ... – nicks

+0

Gibt es irgendwelche Daten im Stream? Was ist seine Länge? – Oscar

+0

siehe bitte bearbeiten – nicks

1

Während die Antwort von @Evk löst Ihr unmittelbares Problem, ist der Code immer noch ineffizient.

Verwenden SftpClient.OpenRead direkt um die Datei zu XmlReader streamen:

using (XmlReader reader = XmlReader.Create(client.OpenRead("filename.xml")) 
{ 
    // process the XML 
} 

oder XmlDocument:

var docc = new XmlDocument(); 
docc.Load(client.OpenRead("filename.xml")); 

Auf diese Weise Sie nicht über einen Speicher verschwenden, indem eine weitere Kopie der Datei in MemoryStream Erstellen .

+0

das ist ein wirklich guter Tipp, danke! – nicks

Verwandte Themen