2012-03-22 10 views
5

Quando sto facendo Deserialize di xml sto ricevendo "C'è un errore nel documento XML (1, 41)." . Qualcuno può dirmi di cosa tratta il problema.C'è un errore nel documento XML (1, 41)

public static T DeserializeFromXml<T>(string xml) 
     { 
      T result; 
      XmlSerializer ser = new XmlSerializer(typeof(T)); 
      using (TextReader tr = new StringReader(xml)) 
      { 
       result = (T)ser.Deserialize(tr); 
      } 
      return result; 
     } 

Io uso questa funzione per farlo.

<?xml version='1.0' encoding='utf-16'?> 
<Message> 
<FirstName>Hunt</FirstName> 
<LastName>DAvid</LastName> 
</Message> 
+12

È possibile includere (una parte di) quel documento XML, in particolare la posizione 1 della riga 41. –

+0

È possibile incollare l'xml qui? –

+1

Sarà utile se potresti copiare l'intero messaggio di errore e inserirlo come parte della tua domanda. –

risposta

14

Assicurarsi che la classe di messaggio si presenta come di seguito:

[Serializable, XmlRoot("Message")] 
public class Message 
{ 
    public string FirstName { get; set; } 

    public string LastName { get; set; } 
} 

Questo funziona per me bene:

string xml = File.ReadAllText("c:\\Message.xml"); 
var result = DeserializeFromXml<Message>(xml); 

MSDN, XmlRoot.ElementName:

Il nome dell'elemento radice XML che viene generato e riconosciuto in un'istanza di documento XML. Il valore predefinito è il nome della classe serializzata.

Quindi il nome della classe potrebbe non essere Message ed è per questo che il deserializzatore non è stato in grado di trovarlo utilizzando il comportamento predefinito.

+0

Grazie! Ho capito che devo sempre impostare la proprietà 'ElementName' all'interno dell'attributo' XmlRoot', perché non è noto in anticipo se il nome della classe 'sarà cambiato nel processo di refactoring. –

2

Concordato con la risposta di sll, ma conobbe un altro ostacolo che stava avendo specificato uno spazio dei nomi negli attributi, quando ricevevo il xml di ritorno che lo spazio dei nomi non era incluso e quindi non riusciva a trovare la classe.

ho dovuto trovare una soluzione alternativa per specificare lo spazio dei nomi nell'attributo e ha funzionato.

ie.

[Serializable()] 
    [XmlRoot("Patient", Namespace = "http://www.xxxx.org/TargetNamespace")] 
    public class Patient 

generato

<Patient xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.xxxx.org/TargetNamespace"> 

ma ho dovuto cambiare a

[Serializable()] 
[XmlRoot("Patient")] 
public class Patient 

che ha generato per

<Patient xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 

Questo risolto il mio problema, spero che aiuta a qualcun altro.

2

Ho avuto la stessa cosa. Tutto si riduceva a una "d" anziché a una "D" in un nome di tag nello schema.

2

Prima verifica le variabili dichiarate utilizzando i tipi di dati corretti. Ho avuto lo stesso problema che ho verificato, per errore ho dichiarato SAPUser come tipo di dati int in modo che l'errore si è verificato. Un'altra cosa che il file XML memorizza i suoi dati usando un concetto come array ma il suo primo indice inizia con +1. ad es. se l'errore è in (7,2), controllare per la sesta linea sempre .....

0

Su un progetto WEC7 su cui sto lavorando, ho ricevuto un errore simile. Il file che stavo serializzando è stato serializzato da una serie di oggetti, quindi ho capito che l'XML andava bene. Inoltre, ho avuto questo lavoro per alcune classi precedenti, quindi è stato piuttosto un puzzle.

Poi ho notato nel mio lavoro precedente che ogni classe che stavo serializzando/deserializzando aveva un costruttore predefinito. Questo mancava nel mio caso fallito, quindi l'ho aggiunto e voilà ... ha funzionato bene.

Mi sembra di ricordare di aver letto da qualche parte che era necessario. Immagino lo sia.

Problemi correlati