2013-07-26 4 views
3

Je suis en train de désérialiser le XML suivant:Impossible Désérialise XML

<?xml version="1.0" encoding="UTF-8"?> 
<jobInfo 
xmlns="http://www.force.com/2009/06/asyncapi/dataload"> 
<id>750x0000000005LAAQ</id> 
<operation>insert</operation> 
<object>Contact</object> 
<createdById>005x0000000wPWdAAM</createdById> 
<createdDate>2009-09-01T16:42:46.000Z</createdDate> 
<systemModstamp>2009-09-01T16:42:46.000Z</systemModstamp> 
<state>Open</state> 
<concurrencyMode>Parallel</concurrencyMode> 
<contentType>CSV</contentType> 
<numberBatchesQueued>0</numberBatchesQueued> 
<numberBatchesInProgress>0</numberBatchesInProgress> 
<numberBatchesCompleted>0</numberBatchesCompleted> 
<numberBatchesFailed>0</numberBatchesFailed> 
<numberBatchesTotal>0</numberBatchesTotal> 
<numberRecordsProcessed>0</numberRecordsProcessed> 
<numberRetries>0</numberRetries> 
<apiVersion>28.0</apiVersion> 
</jobInfo> 

J'ai créé cet objet:

public class JobInfo 
{ 
    public string xmlns { get; set; } 
    public string id { get; set; } 
    public string operation { get; set; } 
    public string @object { get; set; } 
    public string createdById { get; set; } 
    public string createdDate { get; set; } 
    public string systemModstamp { get; set; } 
    public string state { get; set; } 
    public string concurrencyMode { get; set; } 
    public string contentType { get; set; } 
    public string numberBatchesQueued { get; set; } 
    public string numberBatchesInProgress { get; set; } 
    public string numberBatchesCompleted { get; set; } 
    public string numberBatchesFailed { get; set; } 
    public string numberBatchesTotal { get; set; } 
    public string numberRecordsProcessed { get; set; } 
    public string numberRetries { get; set; } 
    public string apiVersion { get; set; } 
} 

public class RootObject 
{ 
    public JobInfo jobInfo { get; set; } 
} 

Et, je suis en utilisant ce code:

XmlSerializer serializer = new XmlSerializer(typeof(RootObject)); 
StringReader rdr = new StringReader(response); 
RootObject resultingMessage = (RootObject)serializer.Deserialize(rdr); 

Cependant, j'obtiens cette erreur:

There is an error in XML document (1, 40). 

{"<jobInfo xmlns='http://www.force.com/2009/06/asyncapi/dataload'> was not expected."} 

Comment puis-je comptabiliser l'attribut xmlns? Mon code, il a comme propriété (donc, il échoue) ...

Répondre

2

Essayez en utilisant le XmlRootAttribute pour spécifier Namespace.

[XmlRoot("jobInfo", Namespace = "http://www.force.com/2009/06/asyncapi/dataload")] 
public class JobInfo 
{ 
    [XmlElement("id")] 
    public string Id { get; set; } 

    [XmlElement("operation")] 
    public string Operation { get; set; } 

    [XmlElement("object")] 
    public string Object { get; set; } 

    [XmlElement("createdById")] 
    public string CreatedById { get; set; } 

    [XmlElement("createdDate")] 
    public DateTime CreatedDate { get; set; } 

    [XmlElement("systemModstamp")] 
    public DateTime SystemModstamp { get; set; } 

    [XmlElement("state")] 
    public string State { get; set; } 

    [XmlElement("concurrencyMode")] 
    public string ConcurrencyMode { get; set; } 

    [XmlElement("contentType")] 
    public string ContentType { get; set; } 

    [XmlElement("numberBatchesQueued")] 
    public string NumberBatchesQueued { get; set; } 

    [XmlElement("numberBatchesInProgress")] 
    public string NumberBatchesInProgress { get; set; } 

    [XmlElement("numberBatchesCompleted")] 
    public string NumberBatchesCompleted { get; set; } 

    [XmlElement("numberBatchesFailed")] 
    public string NumberBatchesFailed { get; set; } 

    [XmlElement("numberBatchesTotal")] 
    public string NumberBatchesTotal { get; set; } 

    [XmlElement("numberRecordsProcessed")] 
    public string numberRecordsProcessed { get; set; } 

    [XmlElement("numberRetries")] 
    public string NumberRetries { get; set; } 

    [XmlElement("apiVersion")] 
    public string ApiVersion { get; set; } 
} 

code:

var xml = @"<?xml version=""1.0"" encoding=""UTF-8""?> 
<jobInfo xmlns=""http://www.force.com/2009/06/asyncapi/dataload""> 
    <id>750x0000000005LAAQ</id> 
    <operation>insert</operation> 
    <object>Contact</object> 
    <createdById>005x0000000wPWdAAM</createdById> 
    <createdDate>2009-09-01T16:42:46.000Z</createdDate> 
    <systemModstamp>2009-09-01T16:42:46.000Z</systemModstamp> 
    <state>Open</state> 
    <concurrencyMode>Parallel</concurrencyMode> 
    <contentType>CSV</contentType> 
    <numberBatchesQueued>0</numberBatchesQueued> 
    <numberBatchesInProgress>0</numberBatchesInProgress> 
    <numberBatchesCompleted>0</numberBatchesCompleted> 
    <numberBatchesFailed>0</numberBatchesFailed> 
    <numberBatchesTotal>0</numberBatchesTotal> 
    <numberRecordsProcessed>0</numberRecordsProcessed> 
    <numberRetries>0</numberRetries> 
    <apiVersion>28.0</apiVersion> 
</jobInfo>"; 

var serializer = new XmlSerializer(typeof(JobInfo)); 

JobInfo jobInfo; 

using(var stream = new StringReader(xml)) 
using(var reader = XmlReader.Create(stream)) 
{ 
    jobInfo = (JobInfo)serializer.Deserialize(reader); 
} 
+0

cela ne remplira pas la propriété 'xmlns'. – VMAtm

+0

Correct, j'ai supprimé la propriété car elle devrait faire partie de la classe. – Romoku

+0

@VMAtm xmlns n'est pas une propriété c'est l'espace de nom par défaut – rene

1

Ajouter l'espace de noms

[XmlRoot("jobInfo",Namespace = "http://www.force.com/2009/06/asyncapi/dataload")] 
    public class JobInfo 
    { 
    // get rid of the xmlns property 
    // other properties stay 
    } 

// there is no rootobject, JobInfo is your root 
XmlSerializer serializer = new XmlSerializer(typeof(JobInfo)); 
StringReader rdr = new StringReader(response); 
JobInfo resultingMessage = (JobInfo)serializer.Deserialize(rdr); 
+0

L'erreur que je reçois est maintenant attribut ' 'XmlElement' est pas valable sur cette déclaration type' – user1477388

+1

Vous devez utiliser' XmlRoot' attribut pour le nom de la classe. – VMAtm

3

Actuellement votre code attend le xmlns comme élément, pas l'attribut.

Vous devez ajouter le XmlSerialization attributes à votre classe, comme ceci:

[XmlRoot("jobInfo", Namespace="http://www.force.com/2009/06/asyncapi/dataload"] 
public class JobInfo 
{ 
    [XmlAttribute] 
    public string xmlns { get; set; } 
    [XmlElement(ElementName = "id")] 
    public string id { get; set; } 
    .... 
} 

Vous pouvez trouver plus d'informations dans les articles MSDN:

+0

FYI, dans mon test, cela fonctionne sauf que la propriété 'xmlns' n'est toujours pas remplie. Je ne sais pas si c'est une limitation ou une mauvaise configuration des attributs. –

+0

Déplacez le nom de l'espace de nom vers la constante et remplissez-le à partir de là. Cela ne changera pas tant que le schéma XML ne changera pas. – VMAtm