如何在 XML 反序列化过程中保留 XML 字符串作为字符串字段

det*_*ale 3 c# xml deserialization

我获得了一个 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>
Run Code Online (Sandbox Code Playgroud)

类定义:

public class SetProfile
{
    public Guid sessionId;
    public string profileDataXml;
}
Run Code Online (Sandbox Code Playgroud)

我希望反序列化语法看起来像

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 ....
}
Run Code Online (Sandbox Code Playgroud)

但 XMLSerializer 将引发异常,并且不会将 < profileDataXml > 的后代输出到原始 XML 字符串中的“profileDataXml”字段。

有什么办法可以实现这样的反序列化吗?

car*_*ira 5

如果您想将其反序列化为 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)