2014-01-21 97 views
1

更新1 问题不是多个命名空间。 我不知道为什么,但如果手动创建生成的类的对象,分配的签名字段和序列化对象,签名节点节点的命名空间为:Xml反序列化c#与多个命名空间

<Signature xmlns="http://www.abrasf.org.br/nfse.xsd"> 

代替

<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> 

如果我给你在XML usign证书,签名的命名空间是

<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> 

有了第一个命名空间,我可以毫无问题deseralizate,但我需要 标志。

Generated Class from wsdl using wsdl.exe

WSDL


schema EnviarLoteRpsEnvio类的EnviarLoteRpsEnvio nfse.xsd:

/// <remarks/> 
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true,  Namespace="http://www.abrasf.org.br/nfse.xsd")] 
public partial class EnviarLoteRpsEnvio 
{ 

    private tcLoteRps loteRpsField; 

    private SignatureType signatureField; 

    /// <remarks/> 
    public tcLoteRps LoteRps 
    { 
     get { return this.loteRpsField; } 
     set { this.loteRpsField = value; } 
    } 

    /// <remarks/> 
    public SignatureType Signature 
    { 
     get { return this.signatureField; } 
     set { this.signatureField = value; } 
    } 
} 

SignatureTypeClass:

/// <remarks/> 
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://www.w3.org/2000/09/xmldsig#")] 
public partial class SignatureType { 

    private SignedInfoType signedInfoField; 

    private SignatureValueType signatureValueField; 

    private KeyInfoType keyInfoField; 

    private ObjectType[] objectField; 

    private string idField; 

    /// <remarks/> 
    public SignedInfoType SignedInfo { 
     get { 
      return this.signedInfoField; 
     } 
     set { 
      this.signedInfoField = value; 
     } 
    } 

    /// <remarks/> 
    public SignatureValueType SignatureValue { 
     get { 
      return this.signatureValueField; 
     } 
     set { 
      this.signatureValueField = value; 
     } 
    } 

从生成的类,产生后续的xml:

xml generated

但是,当我尝试deserealize这个XML,使用功能:

public static object DeserializarParaObjeto(string xmlStr, Type tipo) 
{ 
    TextReader tx = new StringReader(xmlStr); 
    XmlSerializer deSerializer = new XmlSerializer(tipo); 
    deSerializer.UnknownAttribute += deSerializer_UnknownAttribute; 
    deSerializer.UnknownElement += deSerializer_UnknownElement; 
    deSerializer.UnknownNode += deSerializer_UnknownNode;    
    deSerializer.UnreferencedObject += deSerializer_UnreferencedObject; 

    return deSerializer.Deserialize(tx); 
} 

事件deSerializer_UnknownNode被调用(节点未知,签名)。 生成对象,但未分配节点签名。

发生这种情况是因为xml包含多个名称空间?

在这种情况下我需要做什么?

Ps:我没有发布所有的XML和模式,因为太大。

回答

0

我解决了我的问题,其实这个问题不是我的。

我需要手动编辑由wsdl生成的类。exe文件和添加XmlRootAttribute:

部分类EnviarLoteRpsEnvio:

[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://www.abrasf.org.br/nfse.xsd", IsNullable = false)] 

部分类签名:

[System.Xml.Serialization.XmlRootAttribute("Signature", Namespace = "http://www.w3.org/2000/09/xmldsig#", IsNullable = false)] 

而且在porperty 部分类的SignatureType签名EnviarRpsEnvio:

[System.Xml.Serialization.XmlElementAttribute(Namespace="http://www.w3.org/2000/09/xmldsig#")] 

我知道我们绝不能改变生成的类,但在这种情况下我没有其他选择。

相关问题