2010-10-25 13 views
5

Sto cercando di leggere la cronologia di Apple Safari con C#, che è memorizzato in un file plist, tuttavia ottengo sempre un errore e non sono sicuro di quale sia il modo corretto per fallo. Il codice che ho provato ad eseguire è questo:Parsing .plist File in XML semplice C#

XmlDocument xmd = new XmlDocument(); 
xmd.LoadXml(@"C:\Users\Oran\AppData\Roaming\AppleComputer\Safari\History.plist"); 

e ho sempre ottenere il seguente errore: "Data at the root level is invalid. Line 1, position 1."

Qualcuno sa cosa è sbagliato con questo codice e consiglia qual è il modo migliore per leggere i file plist ?

risposta

2

provare questo e everyhing dovrebbe andare bene ;-)

xmd.Load(...) 

Quello che avete utilizzato carichi i dati XML da una stringa, non da un file.

+0

mi dà ancora lo stesso errore ... forse i plists di apple serialze safari in qualche modo? – Oran

+0

1.) Puoi confermare che l'xml è ben formato? Prova ad aprirlo con un editor xml. 2.) Assicurati che il file sia lì. 3.) Assicurati che non ci sia una riga vuota prima dell'elemento radice 4.) E riguardo la sicurezza? Hai il privilegio di aprire il file? (Forse quando la tua app è un servizio web o un sito web non ha il privilegio) – Dennis

+0

1. no, non posso aprirlo con un editor xml, tuttavia si apre perfettamente con l'editor plist ... – Oran

1

Un plist non deve essere XML. Esistono quattro diversi metodi di serializzazione: vecchio stile (per NeXT, non più utilizzato), XML, binario e JSON (nuovo in 10.7). Il History.plist di Safari è molto probabilmente binario, per ragioni di efficienza.

Se non sbaglio, Safari per Windows viene fornito con plutil.exe in Supporto applicazione file comuni \ Apple. Puoi usare questo come plutil -convert xml1 SOME_FILE.plist per convertire il tuo file.

12

Sembra che Apple Safari history.plist sia binario. Ho trovato un grande progetto:

https://github.com/animetrics/PlistCS

Dal readme:

This is a C# Property List (plist) serialization library (MIT license). It supports both XML and binary versions of the plist format.

+0

Funziona perfettamente !! – nathanchere

+0

Ottimo progetto! Incluso in pochissimo tempo. –

+0

Grazie mille @Kluyg – Itkrux

0

Il problema è con la seconda linea, dicendo

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
  • Opzione 1. Rimuovere prima di analizzare.
  • Opzione 2. Leggere il MSDN su "Proprietà XmlDocument.XmlResolver" e capire come eseguire il download di XmlDocument , analizzare e utilizzare il DTD dall'URI specificato nell'XML.