2017-11-03 11 views
0

によると、私は(RFCでXSDを使用してC#クラスにXSDを変換)RFCによると、オブジェクト型の活動に活動をデシリアライズしようとしていますが、私は活動の問題に遭遇してるように思えますxml要素は、属性に内部名前空間を含むためです。PIDFのXMLデシリアライズ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> 

私は([0] presence.Any)第一を取る、プレゼンスオブジェクトにこれをデシリアライズ、および人物オブジェクトにこれをデシリアライズしています、すべてが今のところ大丈夫です。しかし、その後、私は人から活動要素を取り、この非直列化する:

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

をしかし、今、そのオブジェクトのXMLは、次のようになります。

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

そして、私は活動にこれをデシリアライズしようとした場合RFC3863でXSDのように、私は次のエラーメッセージでオブジェクトを終了しています:

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

は、どのように私はこのような内部の名前空間が含まれているXmlElementsをデシリアライズん??

UPDATE 23-11-17(空である要素):

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> 

問題:

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

データエンティティ:

[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

ポストあなたにデシリアライズしようとしているXMLクラス更新:下記の作業のコードを参照してください。 – jdweng

+0

ソースコードが非常に大きいので、ここにpastebinに追加しました:https://pastebin.com/Vj0XMK0d – grmihel

+0

私は少し後で今日見ていきます。 – jdweng

答えて

1

ます対応する名前空間を宣言しなければならないctly、特にデフォルトの名前空間

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 
    { 
    } 
} 

コード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

簡略化されたデータスキーマはおそらくトリックを行います(そして、origianl Xmlエンティティよりもさらに美しいですが、投稿されたXmlクラスはXSDの異なるRFCに基づいています)。 XSD(FlexisipプロジェクトのXSD:https://github.com/BelledonneCommunications/flexisip/tree/master/src/xml)に基づいて自動生成されたエンティティに対して動作します。これはRFC 4479(commonそして、データモデルの名前空間)、RFC 4480(RPID名前空間)とRFC3863(PIDF名前空間)は、それらのいくつかは、クロスレフリーを持っているようだ – grmihel

+0

ませんあなたのエンティティに基づいて実施例を兼ね備えていたもののXSDからC#のエンティティ - > HTTPS。?: //pastebin.com/HdF6FfvZ使用のXSDは、以下の通りである:。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

デシリアライズしているのですか、シリアライズしていますか? xmlの検証は、シリアル化中に行われます。デシリアライズすると、提供されたxmlを使用するだけです。あなたがXMLを読むことができる限り、問題はありません。シリアル化中に型が正しいことを確認したい唯一のことは(int、long、string、DateTime、....)です。私は、通常は必要以上に複雑であり、理解して維持するのが難しくなるため、自動生成コードが嫌いです。私はかわいいコードが好きです。 – jdweng