2014-01-21 66 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#")] 

我知道我們絕不能改變生成的類,但在這種情況下我沒有其他選擇。

相關問題