При попытке получить значения из XML-текста, поступающего из WebService, значения равны нулю, как показано ниже.
string texto =
"<?xml version=\"1.0\"?>" +
"<EnviarLoteRpsResposta xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">"+
" <NumeroLote>3774</NumeroLote>" +
" <DataRecebimento>2014-09-03T23:03:57.3428675-03:00</DataRecebimento>" +
" <Protocolo>635453822373428675</Protocolo>" +
"</EnviarLoteRpsResposta>";
XmlRootAttribute rootAttribute = new XmlRootAttribute("EnviarLoteRpsResposta");
XmlSerializer serializer = new XmlSerializer(typeof(WS.NF.EnviarLoteRpsResposta), rootAttribute);
WS.NF.EnviarLoteRpsResposta ei = (WS.NF.EnviarLoteRpsResposta)serializer.Deserialize(new StringReader(texto));
ei
Из того, что я видел, возврат не является полем ListaMensagemRetorno
. Это проблема?
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.33440")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.e-governeapps2.com.br/")]
public partial class EnviarLoteRpsResposta {
private System.Nullable<ulong> numeroLoteField;
private System.Nullable<System.DateTime> dataRecebimentoField;
private string protocoloField;
private MensagemRetorno[] listaMensagemRetornoField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
public System.Nullable<ulong> NumeroLote {
get {
return this.numeroLoteField;
}
set {
this.numeroLoteField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
public System.Nullable<System.DateTime> DataRecebimento {
get {
return this.dataRecebimentoField;
}
set {
this.dataRecebimentoField = value;
}
}
/// <remarks/>
public string Protocolo {
get {
return this.protocoloField;
}
set {
this.protocoloField = value;
}
}
/// <remarks/>
public MensagemRetorno[] ListaMensagemRetorno {
get {
return this.listaMensagemRetornoField;
}
set {
this.listaMensagemRetornoField = value;
}
}
}
На основе вашего примера проблема заключается в том, что у вас есть другое объявление XML Namespace
между строкой XML, которую вы пытаетесь десериализовать, и самим десериализованным объектом.
В XML-строке XML не имеет декларации пространства имен XML для EnviarLoteRpsResposta
(без пространства имен по умолчанию):
string texto =
"<?xml version=\"1.0\"?>" +
"<EnviarLoteRpsResposta xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">"+
" <NumeroLote>3774</NumeroLote>" +
" <DataRecebimento>2014-09-03T23:03:57.3428675-03:00</DataRecebimento>" +
" <Protocolo>635453822373428675</Protocolo>" +
"</EnviarLoteRpsResposta>";
Хотя в вашем классе EnviarLoteRpsResposta
пространство имен XML объявляется как http://www.e-governeapps2.com.br/
:
...
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.e-governeapps2.com.br/")]
public partial class EnviarLoteRpsResposta { ... }
Для того, чтобы десериализация работала, вам необходимо сделать ОДИН из следующего:
Измените класс EnviarLoteRpsResposta
и удалите объявление XML-пространства имен:
...
/* REMOVED [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.e-governeapps2.com.br/")] */
public partial class EnviarLoteRpsResposta { ... }
Или... Измените веб-службу и добавьте соответствующее пространство имен XML в возвращаемую строку XML:
string texto =
"<?xml version=\"1.0\"?>" +
"<EnviarLoteRpsResposta
xmlns=\"http://www.e-governeapps2.com.br/\"
xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"
xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">"+
" <NumeroLote>3774</NumeroLote>" +
" <DataRecebimento>2014-09-03T23:03:57.3428675-03:00</DataRecebimento>" +
" <Protocolo>635453822373428675</Protocolo>" +
"</EnviarLoteRpsResposta>";
Затем немного измените код для десериализации строки XML:
...
XmlRootAttribute rootAttribute = new XmlRootAttribute("EnviarLoteRpsResposta") { Namespace = "http://www.e-governeapps2.com.br/" };
...
Или... Измените код десериализации строки XML и добавьте прикладное XML-пространство имен программно (без изменений в класс EnviarLoteRpsResposta
или веб-службу):
...
NameTable nt = new NameTable();
XmlNamespaceManager nsmgr = new XmlNamespaceManager(nt);
nsmgr.AddNamespace(String.Empty, "http://www.e-governeapps2.com.br/");
XmlParserContext context = new XmlParserContext(nt, nsmgr, null, XmlSpace.None);
XmlRootAttribute rootAttribute = new XmlRootAttribute("EnviarLoteRpsResposta") { Namespace = "http://www.e-governeapps2.com.br/" };
XmlSerializer serializer = new XmlSerializer(typeof(WS.NF.EnviarLoteRpsResposta), rootAttribute);
WS.NF.EnviarLoteRpsResposta ei = (WS.NF.EnviarLoteRpsResposta)serializer.Deserialize(new XmlTextReader(texto, XmlNodeType.Element, context));
...
ListaMensagemRetorno