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

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字符串中。有没有办法实现这样的反序列化?
3个回答

5
如果您想将其反序列化为XML,则使用XML类型(XElementXmlElement都可以)-请参见下面的代码。
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);
        }
    }
}

1

我认为你可以对这个XML进行反序列化。

看一下这篇文章: 控制XML序列化的属性

最简单的方法是采用反向方法。创建类并应用xml序列化属性,通过序列化实验直到获得与发布的相同的xml结果。一旦获得相同的xml,你的反序列化就会起作用。


XmlAnyElementAttribute works for me when wanting to preserve XML elements that my code base doesn't have a schema for. [XmlAnyElement] public XmlElement[] wildcardElements - GhostRavenstorm

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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接