2011-11-22 24 views
4

此的多個名稱空間是該方案:與XmlSerializer的

我有嵌套類和需要序列然後在XML文檔中

[XmlRoot(Namespace="http://www.foo.bar/myschema")] 
public class root 
{ 
    [XmlAttribute] 
    public string version { get; set; } 

    [XmlElement] 
    public child child { get; set; } 

    ... 
} 

[XmlRoot(Namespace="http://www.foo.bar/myschema")] 
public class child 
{ 
    [XmlElement] 
    public int elemA { get; set; } 

    [XmlElement] 
    public string elemB { get; set; } 

    ... 
} 

我已創建基於在另一示例的方法以除去額外的命名空間和設置自定義一個:

public static void Save<T>(this T type, string path) 
{ 
    System.Xml.Serialization.XmlSerializer xs = 
     new System.Xml.Serialization.XmlSerializer(type.GetType()); 

    System.Xml.Serialization.XmlSerializerNamespaces ns = 
     new System.Xml.Serialization.XmlSerializerNamespaces(); 
    ns.Add("", "http://www.foo.bar/myschema"); 

    using(XmlWriter file = XmlWriter.Create(path)) 
    { 
     xs.Serialize(file, type, ns); 
    } 
} 

我得到這個代碼的結果:

<?xml version="1.0" encoding="utf-8"?> 
<root xmlns="http://www.foo.bar/myschema" version="2.00"> 
    <child> 
     <elemA>1</elemA> 
     ... 
    </child> 
</root> 

但預計:

<?xml version="1.0" encoding="utf-8"?> 
<root xmlns="http://www.foo.bar/myschema" version="2.00"> 
    <child xmlns="http://www.foo.bar/myschema"> 
     <elemA>1</elemA> 
     ... 
    </child> 
</root> 

我們必須設置自定義命名空間聲明兩個標籤中。這可能嗎?

編輯:

這裏是一個真實的例子:

<?xml version="1.0" encoding="UTF-8"?> 
<enviNFe xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.01"> 
    <idLote>200602220000001</idLote> 
    <NFe xmlns="http://www.portalfiscal.inf.br/nfe"> 
     <infNFe Id="NFe310602438167190001085500000000100" versao="1.01"> 
     ... 
     <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> 
     ... 
    </NFe> 
    <NFe xmlns="http://www.portalfiscal.inf.br/nfe"> 
     <infNFe Id="NFe31060243816719000108550000000010011234567900" versao="1.01"> 
     ... 
     <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> 
     ... 
    </NFe> 
    <NFe xmlns="http://www.portalfiscal.inf.br/nfe"> 
     <infNFe Id="NFe31060243816719000108550000000010021234567916" versao="1.01"> 
     ... 
     <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> 
     ... 
    </NFe> 
</enviNFe> 

回答

1

但從你的例子是相同的XML點,所以第一個是完美的罰款。如果您必須使用第二個,那麼我們對XML的理解或處理流程存在嚴重問題。

+0

我已經添加了另一個例子,這個定義是否是錯誤的? –

+0

NFe標記的xmlns屬性是多餘的。 Signature標記的名稱空間是必需的。所以我很確定XmlSerializer不會爲NFe輸出xmlns屬性,而是爲Signature輸出。你試過了嗎? – Achim

+0

問題解決了! Webservice由於標記縮進字符而拒絕該文檔。謝謝! –