2016-07-28 6 views
0

Ich habe die unten XML als Beispiel:Deserialize XML-Knoten mit einem Namespace oder Kolon in C# MVC

<?xml version="1.0" encoding="utf-8"?> 
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:api="http://www.sample.com/api"> 
    <entry> 
    <existing>true</existing> 
    <api:object category="user" id="100"> 
     <api:last-name>Smith</api:last-name> 
     <api:first-name>John</api:first-name> 
    </api:object> 
    </entry> 

    <entry> 
    <existing>false</existing> 
    <api:object category="user" id="101"> 
     <api:last-name>Smith</api:last-name> 
     <api:first-name>Bob</api:first-name> 
    </api:object> 
    </entry> 
</feed> 

Jetzt versuche ich, die XML zu deserialisiert und konnte erfolgreich den Wert für den Knoten erhalten < bestehende>. Das Problem ist, dass ich Nullwerte für die Daten innerhalb von Knoten mit dem Präfix < api:> bekomme. Ich habe gelesen, dass dies etwas mit Namensräumen zu tun hat, aber ich konnte es nicht funktionieren lassen. Ich benutze C# MVC.

Meine Modelle unter:

ElementsUsersRoot.cs

 [Serializable] 
     [XmlType(Namespace = "http://www.w3.org/2005/Atom")] 
     [XmlRoot(ElementName = "feed", Namespace = "http://www.w3.org/2005/Atom", IsNullable = false)] 

     public class ElementsUsersRoot 
     { 
      public ElementsUsersRoot() 
      { 
       ElementsUsersDetails = new List<ElementsUsersData>(); 
      } 

      [XmlElement("entry")] 

      public List<ElementsUsersData> ElementsUsersDetails { get; set; } 

ElementsUsersData.cs

[Serializable] 
    [XmlRoot("entry")] 
    public class ElementsUsersData 
    { 


     [XmlElement("existing")] 
     public bool IsExisting { get; set; } 

     [XmlElement("api:object")] 
     public ElementsUsersAttributes UserAttributes { get; set; }  

    } 

ElementsUsersAttributes.cs

[Serializable] 
    [XmlRoot("api:object", Namespace = "http://www.sample.com/api")] 
    public class ElementsUsersAttributes 
{ 

     [XmlElement("api:first-name")] 
     public string Fname { get; set; } 

     [XmlElement("api:last-name")] 
     public string Lname{ get; set; } 
} 

-Code unten:

using (var client = new HttpClient()) 
       { 
        var byteArray = Encoding.ASCII.GetBytes(apiAccount + ":" + apiPassword); 
        var header = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray)); 
        client.DefaultRequestHeaders.Authorization = header; 

        var stream = await client.GetStreamAsync(apiEndpoint); 
        var serializer = new XmlSerializer(typeof(ElementsUsersRoot)); 

        ElementsUsersRoot userXmlData = (ElementsUsersRoot)serializer.Deserialize(stream); 
        //Add cache here 
        return userXmlData; 

       } 
+1

Präfixe sind * nicht * „Teil“ des Namens. Z.B. Sie haben Elemente namens "object" aus dem Namensraum "http: // www.sample.com/api". Die Tatsache, dass in * diesem * Stück von XML, "api" verwendet wurde, um den Namensraum zu bezeichnen, ist * bedeutungslos *. –

Antwort

0

Wie in den Kommentaren erwähnt, api ist ein Namespace Präfix, es hat nichts mit dem qualifizierten Namen des Elements zu tun.

Ich würde auch die [Serializable] Attribut hat nichts mit XmlSerializer zu tun, so kann entfernt werden, und dass die [XmlRoot] Attribut ist nur relevant für das Wurzelelement.

alle oben Berücksichtigung, werden diese Klassen arbeiten:

[XmlRoot(ElementName = "feed", Namespace = "http://www.w3.org/2005/Atom")] 
public class ElementsUsersRoot 
{ 
    [XmlElement("entry")] 
    public List<ElementsUsersData> ElementsUsersDetails { get; set; } 
} 

public class ElementsUsersData 
{ 
    [XmlElement("existing")] 
    public bool IsExisting { get; set; } 

    [XmlElement("object", Namespace = "http://www.sample.com/api")] 
    public ElementsUsersAttributes UserAttributes { get; set; } 
} 

public class ElementsUsersAttributes 
{ 
    [XmlElement("first-name")] 
    public string Fname { get; set; } 

    [XmlElement("last-name")] 
    public string Lname { get; set; } 
}