2016-12-12 1 views
0

Ich bin die Klasse in ein bestimmtes XML-Format serialisieren. Unten ist die Klassenstruktur & Code, den ich verwendet habe, um es zu serialisieren. Seralisierte Dateien übersehen häufig den Elementnamen "Adresse".C# XML-Serialisierung - Namespace-Problem mit referenziertem Schema

Ich habe 3 Klassen StudentInfo, die zwei Eigenschaften des Typs "Student" & "Adresse"

[Serializable] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlRoot("StudentInfo", Namespace = "http://TestBizTalkMap.Student")] 
public class StudentInfo 
{ 
    [System.Xml.Serialization.XmlElement("", Namespace = "")] 
    public Student Student { get; set; } 

    [System.Xml.Serialization.XmlElement("ns1", Namespace = "ns1:http://TestBizTalkMap.Address")] 

     public Address Address { get; set; } 
} 

[Serializable] 
public class Student 
{ 
    public string EnrollNo { get; set; } 
    public string Name { get; set; } 
    public string BTSReceivedOn { get; set; } 
} 

[Serializable] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlRoot("Address", Namespace = "http://TestBizTalkMap.Address")] 
public class Address 
{ 
    [XmlElement("",Namespace="")] 
    public string City { get; set; } 
    [XmlElement("", Namespace = "")] 
    public string State { get; set; } 
} 

-Code es gebraucht hat, um zu serialze:

public XmlDocument GetXMLSchema<T>(T type, string schemeNameSpace) 
{ 
    XmlDocument xmlDoc = new XmlDocument(); 
    XmlSerializer xmlSerializer = new XmlSerializer(type.GetType()); 
    try 
    { 
      using (MemoryStream xmlStream = new MemoryStream()) 
      { 
       XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
       ns.Add("ns0", schemeNameSpace); 
       xmlSerializer.Serialize(xmlStream, type, ns); 
       xmlStream.Position = 0; 
       xmlDoc.Load(xmlStream); 
       if (xmlDoc.FirstChild.NodeType == XmlNodeType.XmlDeclaration) 
       { 
        xmlDoc.RemoveChild(xmlDoc.FirstChild); 
       } 
      } 
    } 
    catch (Exception ex) 
    { 
      throw ex; 
    } 
      return xmlDoc; 
    } 

es es als

serialisiert
<ns0:StudentInfo xmlns:ns0="http://TestBizTalkMap.Student"> 
<Student> 
<EnrollNo>EnrollNl</EnrollNo> 
<Name>Name</Name> 
<BTSReceivedOn>BTSReceivedOn</BTSReceivedOn> 
</Student> 

<ns1 xmlns="http://TestBizTalkMap.Address"> 
<City>City</City> 
<State>State</State> 
</ns1> 
</ns0:StudentInfo 

Während ich möchte es als

0 serialisiert bekommen
<ns0:StudentInfo xmlns:ns0="http://TestBizTalkMap.Student"> 
    <Student> 
    <EnrollNo>EnrollNo_0</EnrollNo> 
    <Name>Name_0</Name> 
    <BTSReceivedOn>BTSReceivedOn_0</BTSReceivedOn> 
    </Student> 

<ns1:Adress xmlns:ns1="http://TestBizTalkMap.Address"> 
    <City>City_0</City> 
    <State>State_0</State> 
    </ns1:Adress> 
</ns0:StudentInfo> 

Irgendwelche Hilfe?

Dank

+0

Haben Sie versucht, 'XmlElement (" ns1 ", Namespace =" ... ")' zu 'XmlElement (" Adresse ", Namespace =" ... ")' in der Address-Eigenschaft zu ändern? Scheint ziemlich offensichtlich, dachte aber, ich würde nachsehen –

Antwort

1

Sie scheinen furchtbar zwischen Namen und Namensräume verwirrt bekommen zu haben. Der Name Ihres Elements Address ist Address, nicht ns1, und sein Namensraum ist http://TestBizTalkMap.Address, nicht .

Das ist alles was Sie brauchen, um das korrekte XML zu generieren.

[XmlRoot(Namespace = "http://TestBizTalkMap.Student")] 
public class StudentInfo 
{ 
    [XmlElement(Namespace = "")] 
    public Student Student { get; set; } 
    [XmlElement(Namespace = "http://TestBizTalkMap.Address")] 
    public Address Address { get; set; } 
} 

public class Student 
{ 
    public string EnrollNo { get; set; } 
    public string Name { get; set; } 
    public string BTSReceivedOn { get; set; } 
} 

public class Address 
{  
    [XmlElement(Namespace = "")] 
    public string City { get; set; }   
    [XmlElement(Namespace = "")] 
    public string State { get; set; } 
} 

Der Namespace Präfixe sind unwichtig, aber wenn Sie wirklich wollen sein ns0 und ns1 dann können Sie diese angeben, über die XmlSerializerNamespaces Sie zum Serialize Methode übergeben:

var ns= new XmlSerializerNamespaces(); 
ns.Add("ns0", "http://TestBizTalkMap.Student"); 
ns.Add("ns1", "http://TestBizTalkMap.Address"); 

Und wenn Sie wollen nicht die XML-Deklaration, dann nicht Laden Sie die resultierende XML in eine XmlDocument und entfernen Sie es, nur aufhören, es an erster Stelle geschrieben mit XmlWriterSettings:

var settings = new XmlWriterSettings 
{ 
    OmitXmlDeclaration = true, 
    // ... 
}; 

Eine funktionierende Demoversion finden Sie unter this fiddle.