2017-11-03 2 views
0

Ich versuche, Aktivität in Objekttyp Aktivitäten nach dem RFC (konvertierte XSD zu C# -Klasse mit der XSD in der RFC) zu deserialisieren, aber es scheint, dass ich Probleme mit der Aktivität XML-Element, da es einen inneren Namensraum im Attribut enthält.PIDF XML Deserialisierung nach RFC 3863

XML:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?> 
<presence xmlns="urn:ietf:params:xml:ns:pidf" entity="sip:[email protected]" xmlns:e="urn:ietf:params:xml:ns:pidf:status:rpid" xmlns:dm="urn:ietf:params:xml:ns:pidf:data-model" xmlns:ce="urn:cisco:params:xml:ns:pidf:rpid" xmlns:sc="urn:ietf:params:xml:ns:pidf:servcaps"> 
    <dm:person> 
    <status> 
    <basic>open</basic> 
    </status> 
    <e:activities> 
    </e:activities> 
    </dm:person> 
</presence> 

ich dies in eine Präsenzobjekt am Deserialisieren, den ersten (presence.Any [0]) nehmen, und dies in einer Person, Objekt deserialisieren, ist alles so weit in Ordnung. Aber dann möchte ich das Aktivitätselement von Person zu nehmen, und deserialisieren dies:

person.Any.SingleOrDefault(x => x.LocalName == "activities") 

Aber jetzt ist die XML dieses Objekts wie folgt aussieht:

<e:activities xmlns:e="urn:ietf:params:xml:ns:pidf:status:rpid"> 
    </e:activities> 

Und wenn ich versuche, dies in eine Tätigkeit deserialisieren Objekt als von XSD in RFC3863, ich bin mit der Endung der folgenden Fehlermeldung:

Message "<activities xmlns='urn:ietf:params:xml:ns:pidf:status:rpid'> was not expected." 

wie kann ich deserialisieren XmlElements, die einen inneren Namespace wie folgt enthält ??

UPDATE 23-11-17 (Elemente, die leer ist):

XML:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<presence xmlns="urn:ietf:params:xml:ns:pidf" xmlns:pp="urn:ietf:params:xml:ns:pidf:person" xmlns:es="urn:ietf:params:xml:ns:pidf:rpid:status:rpid-status" xmlns:ep="urn:ietf:params:xml:ns:pidf:rpid:rpid-person" entity="sip:[email protected]"> 
    <pp:person> 
     <status> 
      <ep:activities> 
       <ep:away/> 
      </ep:activities> 
     </status> 
    </pp:person> 
    <note>Unavailable</note> 
    <tuple id="6001"> 
     <contact priority="1">sip:[email protected]</contact> 
     <status> 
      <basic>closed</basic> 
     </status> 
    </tuple> 
</presence> 

Problem:

<ep:away xmlns:ep="urn:ietf:params:xml:ns:pidf:rpid:rpid-person" /> 

Dateneinheiten:

[XmlType(TypeName = "activities", Namespace = "urn:ietf:params:xml:ns:pidf:rpid:rpid-person")] 
public class Activities : activities 
{ 
    [XmlElement(Namespace = "urn:ietf:params:xml:ns:pidf:rpid:rpid-person")] 
    public ItemsChoiceType State { get; set; } 
} 


/// <remarks/> 
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")] 
[System.SerializableAttribute()] 
[System.Xml.Serialization.XmlTypeAttribute(Namespace="urn:ietf:params:xml:ns:pidf:rpid", IncludeInSchema=false)] 
public enum ItemsChoiceType { 

    /// <remarks/> 
    [System.Xml.Serialization.XmlEnumAttribute("##any:")] 
    Item, 

    /// <remarks/> 
    appointment, 

    /// <remarks/> 
    away, 

    /// <remarks/> 
    breakfast, 

    /// <remarks/> 
    busy, 

    /// <remarks/> 
    dinner, 

    /// <remarks/> 
    holiday, 

    /// <remarks/> 
    [System.Xml.Serialization.XmlEnumAttribute("in-transit")] 
    intransit, 

    /// <remarks/> 
    [System.Xml.Serialization.XmlEnumAttribute("looking-for-work")] 
    lookingforwork, 

    /// <remarks/> 
    meal, 

    /// <remarks/> 
    meeting, 

    /// <remarks/> 
    [System.Xml.Serialization.XmlEnumAttribute("on-the-phone")] 
    onthephone, 

    /// <remarks/> 
    other, 

    /// <remarks/> 
    performance, 

    /// <remarks/> 
    [System.Xml.Serialization.XmlEnumAttribute("permanent-absence")] 
    permanentabsence, 

    /// <remarks/> 
    playing, 

    /// <remarks/> 
    presentation, 

    /// <remarks/> 
    shopping, 

    /// <remarks/> 
    sleeping, 

    /// <remarks/> 
    spectator, 

    /// <remarks/> 
    steering, 

    /// <remarks/> 
    travel, 

    /// <remarks/> 
    tv, 

    /// <remarks/> 
    unknown, 

    /// <remarks/> 
    vacation, 

    /// <remarks/> 
    working, 

    /// <remarks/> 
    worship, 
} 
+0

Schreiben Sie die XML-Klasse, die Sie versuchen, in deserialisieren. – jdweng

+0

Hier in Pastebin hinzugefügt, da der Quellcode ziemlich groß ist: https://pastebin.com/Vj0XMK0d – grmihel

+0

Ich werde heute ein wenig später schauen. – jdweng

Antwort

1

Sie muss die Namensräume entsprechend deklarieren sicher, vor allem die Standard-Namespaces. Siehe Arbeits Code unten:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Serialization; 
using System.IO; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     const string INPUT_FILENAME = @"c:\temp\test.xml"; 
     const string OUTPUT_FILENAME = @"c:\temp\test1.xml"; 
     static void Main(string[] args) 
     { 

      Presence outPresence = new Presence() 
      { 
       person = new Person() 
       { 
        status = new Status() 
        { 
         basic = "test" 
        }, 
        activities = new Activities() 
        { 
        } 
       } 
      }; 
      XmlSerializerNamespaces xmlNameSpace = new XmlSerializerNamespaces(); 
      xmlNameSpace.Add("dm", "urn:ietf:params:xml:ns:pidf:data-model"); 
      xmlNameSpace.Add("e", "urn:ietf:params:xml:ns:pidf:status:rpid"); 
      xmlNameSpace.Add("", ""); 

      XmlSerializer serializer = new XmlSerializer(typeof(Presence), "urn:ietf:params:xml:ns:pidf"); 

      XmlWriterSettings settings = new XmlWriterSettings(); 
      settings.Indent = true; 

      XmlWriter writer = XmlWriter.Create(OUTPUT_FILENAME, settings); 
      serializer.Serialize(writer, outPresence, xmlNameSpace); 

      StreamReader reader = new StreamReader(INPUT_FILENAME); 

      Presence presense = (Presence)serializer.Deserialize(reader); 
     } 

    } 
    [XmlRoot(ElementName = "presence")] 
    public class Presence 
    { 
     [XmlElement(ElementName = "person", Namespace = "urn:ietf:params:xml:ns:pidf:data-model")] 
     public Person person { get; set; } 
    } 
    [XmlRoot(ElementName = "person", Namespace = "urn:ietf:params:xml:ns:pidf:data-model")] 
    public class Person 
    { 
     [XmlElement(ElementName = "status", Namespace = "urn:ietf:params:xml:ns:pidf")] 
     public Status status { get; set; } 

     [XmlElement(ElementName = "activities", Namespace = "urn:ietf:params:xml:ns:pidf:status:rpid")] 
     public Activities activities { get; set; } 
    } 
    [XmlRoot(ElementName = "status", Namespace = "urn:ietf:params:xml:ns:pidf")] 
    public class Status 
    { 
     [XmlElement("basic")] 
     public string basic { get; set; } 
    } 
    [XmlRoot(ElementName = "activities", Namespace = "urn:ietf:params:xml:ns:pidf:status:rpid")] 
    public class Activities 
    { 
    } 
} 

Aktualisiert Code 11/23/17

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Serialization; 
using System.IO; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     const string INPUT_FILENAME = @"c:\temp\test.xml"; 
     const string OUTPUT_FILENAME = @"c:\temp\test1.xml"; 
     static void Main(string[] args) 
     { 

      Presence outPresence = new Presence() 
      { 
       person = new Person() 
       { 
        status = new Status() 
        { 
         basic = "test", 
         activities = new Activities() 
         { 
         } 
        }, 
       } 
      }; 
      XmlSerializerNamespaces xmlNameSpace = new XmlSerializerNamespaces(); 
      xmlNameSpace.Add("pp", "urn:ietf:params:xml:ns:pidf:person"); 
      xmlNameSpace.Add("ep", "urn:ietf:params:xml:ns:pidf:rpid:rpid-person"); 
      xmlNameSpace.Add("", "urn:ietf:params:xml:ns:pidf"); 

      XmlSerializer serializer = new XmlSerializer(typeof(Presence), "urn:ietf:params:xml:ns:pidf"); 

      XmlWriterSettings settings = new XmlWriterSettings(); 
      settings.Indent = true; 

      XmlWriter writer = XmlWriter.Create(OUTPUT_FILENAME, settings); 
      serializer.Serialize(writer, outPresence, xmlNameSpace); 

      StreamReader reader = new StreamReader(INPUT_FILENAME); 

      Presence presense = (Presence)serializer.Deserialize(reader); 
     } 

    } 
    [XmlRoot(ElementName = "presence")] 
    public class Presence 
    { 
     [XmlElement(ElementName = "person", Namespace = "urn:ietf:params:xml:ns:pidf:person")] 
     public Person person { get; set; } 
    } 
    [XmlRoot(ElementName = "person", Namespace = "urn:ietf:params:xml:ns:pidf:person")] 
    public class Person 
    { 
     [XmlElement(ElementName = "status", Namespace = "urn:ietf:params:xml:ns:pidf")] 
     public Status status { get; set; } 

    } 
    [XmlRoot(ElementName = "status", Namespace = "urn:ietf:params:xml:ns:pidf")] 
    public class Status 
    { 
     [XmlElement("basic")] 
     public string basic { get; set; } 

     [XmlElement(ElementName = "activities", Namespace = "urn:ietf:params:xml:ns:pidf:rpid:rpid-person")] 
     public Activities activities { get; set; } 

    } 
    [XmlRoot(ElementName = "activities", Namespace = "urn:ietf:params:xml:ns:pidf:rpid:rpid-person")] 
    public class Activities 
    { 
     [XmlElement("away")] 
     public string away { get; set; } 
    } 
} 
+0

Ihr vereinfachtes Datenschema würde wahrscheinlich den Zweck erfüllen (und ist sogar hübscher als die ursprünglichen Xml-Entitäten. Aber die gebuchten Xml-Klassen stammen von XSD, basierend auf verschiedenen RFCs, und aus diesem Grund möchte ich wirklich eine Lösung finden, dass funktioniert gegen diese Entitäten, die basierend auf den XSDs (dh dem XSD im Flexisip-Projekt: https://github.com/BelledonneCommunications/flexisip/tree/master/src/xml) automatisch generiert werden, das auf RFC 4479 (common und Namespaces von Datamodellen), RFC 4480 (Rpid-Namespace) und RFC3863 (Pidf-Namespace), einige von ihnen scheinen Cross-Refs zu haben – grmihel

+0

Haben Sie ein funktionierendes Beispiel basierend auf den Entitäten kombiniert von diesen XSDs? C# Entities -> https: //pastebin.com/HdF6FfvZ Es werden folgende XSDs verwendet: https://github.com/BelledonneCommunications/flexisip/blob/master/src/xml/rpid.xsd https://github.com/BelledonneCommunications/flexisip/blob/ Master/src/xml/xml.xsd https://github.com/BelledonneCommunications/flexisip/blob/ma ster/src/xml/pidf% 2Bxml.xsd https://github.com/BelledonneCommunications/flexisip/blob/master/src/xml/data-model.xsd https://github.com/BelledonneCommunications/flexisip/blob/ master/src/xml/common-schema.xsd – grmihel

+0

Werden Sie gerade serialisiert oder serialisiert? Die Validierung eines XML-Codes erfolgt während der Serialisierung. Deserialisieren Sie sind nur gezwungen, das bereitgestellte XML zu verwenden.Solange Sie das XML lesen können, gibt es kein Problem. Das einzige, was Sie während der Serialisierung sicherstellen müssen, ist dass der Typ korrekt ist (int, long, string, DateTime, ....). Ich mag nicht automatisch generierten Code, weil es in der Regel viel komplizierter als notwendig ist und macht es schwierig zu verstehen und zu pflegen. Ich mag meinen schönen Code. – jdweng