Benutzer mit den meisten Antworten
Fehler beim picken einer XML-Datei: The Uri parameter must be a file system relative path

Frage
-
Hallo Leute,
bin heute auf mein nächstes Problem gestoßen. Bin dabei das programmieren von Windows Phone Store zu lernen [WinRT also].
Ich versuche durch einen FilePicker eine XML Datei zu finden, das geht auch, aber wenn ich den Pfad an den xmlReader übergebe bekomme ich folgenden Fehler:
Eine Ausnahme (erste Chance) des Typs "System.Xml.XmlException" ist in SYSTEM.XML.NI.DLL aufgetreten. System.Xml.XmlException: Cannot open 'file:///D:/Schlachter.xml'. The Uri parameter must be a file system relative path. at System.Xml.XmlRelativePathResolver.CheckParameters(Uri uri, Type typeOfObjectToReturn) at System.Xml.XmlRelativePathResolver.GetEntity(Uri uri, String role, Type typeOfObjectToReturn) at System.Xml.XmlTextReaderImpl.FinishInitUriString() at System.Xml.XmlTextReaderImpl..ctor(String uriStr, XmlReaderSettings settings, XmlParserContext context, XmlResolver uriResolver) at System.Xml.XmlReaderSettings.CreateReader(String inputUri, XmlParserContext inputContext) at System.Xml.XmlReader.Create(String inputUri, XmlReaderSettings settings, XmlParserContext inputContext) at System.Xml.XmlReader.Create(String inputUri) at Bible.Model.xmlRead.ReadNodes(String path, Int32 _book, Int32 _chapter)
Die Datei ist im Emulator über die SD-Karte eingebunden.
Folgenden Code habe ich geschrieben:
private void bReadXML_click(object sender, RoutedEventArgs e) { FileOpenPicker openPicker = new FileOpenPicker(); openPicker.ViewMode = PickerViewMode.Thumbnail; openPicker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary; openPicker.FileTypeFilter.Add(".xml"); try { openPicker.PickSingleFileAndContinue(); } catch(Exception test) { txtFilePickerName.Text = test.ToString(); } } [...] public void ContinueFileOpenPicker(FileOpenPickerContinuationEventArgs args) { if (args.Files.Count > 0) { txtFilePickerPath.Text = "TEST: " + args.Files[0].Path; xmlRead Test = new xmlRead(); chapterList Test2 = Test.ReadNodes(args.Files[0].Path, 1, 1); } else { txtFilePickerName.Text = "Operation cancelled."; } }
Und die andere Seite:
class xmlRead { public xmlRead() { //Do nothing } public chapterList ReadNodes(string path, int book, int chapter) { //Deklaration chapterList _layout = new chapterList(); int _bnumber = 0; int _cnumber = 0; int _vnumber = 0; //Programm try{ XmlReader reader = XmlReader.Create(path); [...] catch(Exception e) { Debug.WriteLine(e); }
Beim Übergabe parameter für "path" steht, wenn ich im Debugger nachschaue: "D:\\Schlachter.xml"
Ich kann aber zu der Fehlermeldung nichts finden...
Kann mir da jemand helfen?
Antworten
-
Hallo,
ob relative Pfade unter WinPhone wirklich immer vom selben Pfad ausgehen kann ich dir nicht sagen. Du musst leider damit rechnen, dass sich das mal ändert.Ggf. kannst du den StorageFolder auch direkt von der Pfadangabe abfragen:
var folder = await StorageFolder.GetFolderFromPathAsync(@"PATH");
Zusammensetzen musst du den Pfad jedoch nach wie vor selbst. Auch glaube ich das er von den Systemeinstellungen abhängt, wo Daten gespeichert werden sollen.
Ich würde wenn möglich allerdings auf das weitestgehend sinnlose kopieren der Datei verzichten. Ich fand im Internet noch folgenden Lösungsansatz:
XmlDocument reade = await XmlDocument.LoadFromFileAsync(storageFile); XmlReader reader = XmlReader.Create(new StringReader(reade.GetXml()));
Meinerseits ungetestet, kannst du auch nochmal folgendes probieren:var file = await folder.GetFileAsync(""); using (var stream = await file.OpenStreamForReadAsync()) { var reader = XmlReader.Create(stream); }
Woher hast du die Info, dass der XmlReader zwingend einen relativen Pfad benötigt? So oder so sollte es über die beiden anderen Lösungen kein Problem darstellen.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort markiert PHep Montag, 16. Februar 2015 21:10
Alle Antworten
-
Hallo,
hast du in deinem App Manifest auch angegeben, dass du von der SD Karte lesen willst? Öffne dazu die Package.appxmanifest-Datei aus dem Projektmappen-Explorer, wechsle in den Tab Funktionen und setze einen Haken bei Wechselspeichergeräte.Sonst sah dein Code beim überfliegen korrekt aus*.
*Warum auch immer man einen XmlReader nicht aus einer StorageFile erzeugen kann...
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets -
Ja, das hatte ich auch schon vermutet aber daran lag es nicht, noch vielen herumexperementieren habe ich herausgefunden, dass er halt wirklich einen relativen Pfad braucht.
Wenn ich jetzt an den Reader einfach nur "Schlachter.xml" übergebe dann bekomme ich die folgende Exception:
Could not find file 'D:\WPSystem\SharedData\PhoneTools\AppxLayouts\6376444a-e5c7-44e7-92d9-85b8bd034884VS.Debug_x86.Familie\Schlachter.xml'
Ich kopiere die Datei mit folgendem Code:
var file = await Windows.Storage.StorageFile.GetFileFromPathAsync(args.Files[0].Path); try { var folder = ApplicationData.Current.LocalFolder; var file2 = await file.CopyAsync(folder); } catch (Exception e) { System.Diagnostics.Debug.WriteLine(e); } try { xmlRead Test = new xmlRead(); chapterList Test2 = Test.ReadNodes(file.Name, 1, 1); } catch (Exception e) { System.Diagnostics.Debug.WriteLine(e); }
Er kopiert die Datei aber irgendwo anders hin nämlich file2.path="D:\WPSystem\AppData\Local\Packages\6376444a-e5c7-44e7-92d9-85b8bd034884_1st60v50b0j9t\LocalState\Schlachter.xml"
Also scheint ja
var folder = ApplicationData.Current.LocalFolder;
Nicht das richtige zu sein...
Wie komme ich jetzt in den Ordner von der o.g. exception?
_________________________________
UPDATE:
So, habe es hinbekommen die Lösung war:
var folder = Windows.ApplicationModel.Package.Current.InstalledLocation;
Warum ich aber die Datei von der SD-Karte nicht direkt einlesen kann bleibt mir ein Rätsel!
Also muss ich die Datei erst die InstalledLocation kopieren dort verarbeiten und dann dort wieder löschen...
Aber wenn jemand eine bessere Lösung hat, bin ich aufnahmebereit!!!
PS: Vielen Dank Koopakiller für den unermüdlichen Support!!!
- Bearbeitet PHep Samstag, 14. Februar 2015 15:27
-
Hallo,
ob relative Pfade unter WinPhone wirklich immer vom selben Pfad ausgehen kann ich dir nicht sagen. Du musst leider damit rechnen, dass sich das mal ändert.Ggf. kannst du den StorageFolder auch direkt von der Pfadangabe abfragen:
var folder = await StorageFolder.GetFolderFromPathAsync(@"PATH");
Zusammensetzen musst du den Pfad jedoch nach wie vor selbst. Auch glaube ich das er von den Systemeinstellungen abhängt, wo Daten gespeichert werden sollen.
Ich würde wenn möglich allerdings auf das weitestgehend sinnlose kopieren der Datei verzichten. Ich fand im Internet noch folgenden Lösungsansatz:
XmlDocument reade = await XmlDocument.LoadFromFileAsync(storageFile); XmlReader reader = XmlReader.Create(new StringReader(reade.GetXml()));
Meinerseits ungetestet, kannst du auch nochmal folgendes probieren:var file = await folder.GetFileAsync(""); using (var stream = await file.OpenStreamForReadAsync()) { var reader = XmlReader.Create(stream); }
Woher hast du die Info, dass der XmlReader zwingend einen relativen Pfad benötigt? So oder so sollte es über die beiden anderen Lösungen kein Problem darstellen.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort markiert PHep Montag, 16. Februar 2015 21:10
-
Woher hast du die Info, dass der XmlReader zwingend einen relativen Pfad benötigt? So oder so sollte es über die beiden anderen Lösungen kein Problem darstellen.
Das stand in der Exception:
The Uri parameter must be a file system relative path
Ich mache es auf jeden Fall jetzt so, wie du es vorgeschlagen hast:
XmlDocument reade = await XmlDocument.LoadFromFileAsync(storageFile); XmlReader reader = XmlReader.Create(new StringReader(reade.GetXml()));
Und über gebe dann einfach den XmlReader! Ist doch "etwas" komfortabler als das das hin und her kopiere...
Top - Danke für deine Mühe!!!