3

XML 入力文字列を取得し、未加工の XML を部分的に保持するオブジェクトにデシリアライズしたいと考えています。

<SetProfile>
  <sessionId>A81D83BC-09A0-4E32-B440-0000033D7AAD</sessionId>
  <profileDataXml>
    <ArrayOfProfileItem>
      <ProfileItem>
        <Name>Pulse</Name>
        <Value>80</Value>
      </ProfileItem>
      <ProfileItem>
        <Name>BloodPresure</Name>
        <Value>120</Value>
      </ProfileItem>
    </ArrayOfProfileItem>
  </profileDataXml>
</SetProfile>

クラス定義:

public class SetProfile
{
    public Guid sessionId;
    public string profileDataXml;
}

逆シリアル化の構文が次のようになることを願っています

string inputXML = "..."; // the above XML
XmlSerializer xs = new XmlSerializer(typeof(SetProfile));
using (TextReader reader = new StringReader(inputXML))
{
    SetProfile obj = (SetProfile)xs.Deserialize(reader);
    // use obj ....
}

ただし、XMLSerializer は例外をスローし、< profileDataXml > の子孫を生の XML 文字列の「profileDataXml」フィールドに出力しません。

そのような逆シリアル化を実装する方法はありますか?

4

3 に答える 3

4

それを XML としてデシリアライズする場合は、XML タイプを使用します (XElementまたはXmlElement動作するはずです)。以下のコードを参照してください。

public class StackOverflow_11234676
{
    const string XML = @"<SetProfile>
                          <sessionId>A81D83BC-09A0-4E32-B440-0000033D7AAD</sessionId>
                          <profileDataXml>
                            <ArrayOfProfileItem>
                              <ProfileItem>
                                <Name>Pulse</Name>
                                <Value>80</Value>
                              </ProfileItem>
                              <ProfileItem>
                                <Name>BloodPresure</Name>
                                <Value>120</Value>
                              </ProfileItem>
                            </ArrayOfProfileItem>
                          </profileDataXml>
                        </SetProfile>";

    public class SetProfile
    {
        public Guid sessionId;
        public XElement profileDataXml;
    }
    public static void Test()
    {
        string inputXML = XML;
        XmlSerializer xs = new XmlSerializer(typeof(SetProfile));
        using (TextReader reader = new StringReader(inputXML))
        {
            SetProfile obj = (SetProfile)xs.Deserialize(reader);
            Console.WriteLine(obj.profileDataXml);
        }
    }
}
于 2012-06-27T21:58:44.037 に答える
0

これには Xml.Linq を使用します。

setProfile obj = new setProfile();
var doc = XDocument.Parse(yourXml);
obj.sessionID = doc.Root.Element("sessionID").value;
obj.profileDataXml = doc.Root.Element("profileDataXml").value;
于 2012-06-27T21:53:31.137 に答える
0

この XML を逆シリアル化できると思います。

この記事をご覧ください: XML シリアライゼーションを制御する属性

それを機能させる最も簡単な方法は、REVERSE アプローチを使用することです。クラスを作成し、xml シリアライゼーション属性を適用して、投稿されたものと同じ xml 結果が得られるまでシリアライゼーションを試してください。同じ xml を取得すると、逆シリアル化が機能します。

于 2012-06-27T21:12:43.970 に答える