У меня есть такой 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
BrianKE 11 Мар 2015 в 05:55

2 ответа

Лучший ответ

Я решил эту проблему, заключив код 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, как показано в этом сообщение

0
Community 23 Май 2017 в 12:22

Я не уверен, что вы этого хотите, но если вы определите класс для своего элемента 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>
0
vesan 11 Мар 2015 в 04:51