XML节点内的XM​​L

时间:2015-03-11 02:55:57

标签: c# xml xml-deserialization

我有以下XML:

  <CallStep>
    <StepXaml>
      <StackPanel xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                  xmlns:uc="clr-namespace:CallTracker.Library.UserControls.BaseUserControls;assembly=CallTracker.Library">
        <uc:LabelValueControl Label="TestLabel" Value="356733" />
      </StackPanel>
    </StepXaml>
</CallStep>

我希望将其存储在属性中

[XmlElement("StepXaml")]
public object StepXaml { get; set; }

我正在使用XmlSerializer将XML反序列化为包含StepXaml属性的类。目前,当我反序列化XML时,<StackPanel>被反序列化为自己的节点。

是否有办法阻止反序列化程序尝试向下钻取<StackPanel>,而是在<StepXaml></StepXaml>之间保留所有内容。 {{1}}作为一个对象返回?

2 个答案:

答案 0 :(得分:0)

我不确定这是否是您想要的,但如果您为CallStep元素定义了这样一个类:

public class CallStep
{
    //XmlElement attribute is not needed, because the name of the 
    //property and the XML element is the same
    public XmlDocument StepXaml { get; set; }
}

然后像这样调用反序列化:

//xml is a string containing the XML from your question
XmlSerializer serializer = new XmlSerializer(typeof(CallStep));
using (StringReader reader = new StringReader(xml))
{
    CallStep cs = (CallStep)serializer.Deserialize(reader);
}

然后cs.StepXaml将是一个包含以下内容的XmlDocument:

  <StackPanel xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:uc="clr-namespace:CallTracker.Library.UserControls.BaseUserControls;assembly=CallTracker.Library">
    <uc:LabelValueControl Label="TestLabel" Value="356733" />
  </StackPanel>

答案 1 :(得分:0)

我通过将XAML代码包装在CDATA块中来解决这个问题,如下所示:

    <StepXaml>
        <![CDATA[<StackPanel xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                      xmlns:uc="clr-namespace:CallTracker.Library.UserControls.BaseUserControls;assembly=CallTracker.Library">
            <uc:LabelValueControl Label="TestLabel2" Value="356738124315" />
          </StackPanel>]]>
    </StepXaml>

然后我将其提取到我可以在ContentControl中使用的对象,如post

所示