C#xml序列化 - 属性的多个选择

时间:2012-08-01 15:54:46

标签: c# xml serialization xml-serialization

我有一个变量失败,可能有三个值:传递,失败或错误。在序列化期间我想要发生的是基于值创建元素。对于传递,我想忽略该元素。对于失败,我想要一个失败元素。对于错误,我想要一个错误元素。怎么办呢?

在Test类中,有一个名为m_steps的步骤列表。在Step中有一个名为m_failure的变量,它保存传递,失败或错误。我希望m_steps创建的元素是非元素(传递),失败或错误。

[XmlRoot("testsuite")]
public class Suite
{
    [XmlAttribute("name")]
    public string m_name;

    [XmlElement("testcase")]
    public List<Test> m_tests;

    [XmlIgnore]
    public string m_timestamp;


public class Test
{
    [XmlAttribute("name")]
    public string m_name;

    [XmlElement("failure")] // want to be ignore, failure or error instead of just failure
    public List<Step> m_steps;

    [XmlAttribute("assertions")]
    public int m_assertions;
}


public class Step
{
    [XmlIgnore]
    public string m_failure; // holds passed, failure, or error

    [XmlTextAttribute]
    public string m_message;

    [XmlIgnore]
    public string m_image;

    [XmlAttribute("type")]
    public string m_type;
}

寻找:

要:

<?xml version="1.0" encoding="UTF-8"?>
-<testsuite name=" SimpleCalculationsSuite" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
  -<testcase name="Add 3+4" assertions="1"></testcase>
  -<testcase name="Fail 3-4" assertions="1"> 
     <failure type="Text">The control text is not correct. Expected-7 Actual--1</failure> 
   </testcase> 
  -<testcase name="Error 3*4" assertions="1"> 
     <error type="Click">The * button was not found</error> 
 </testsuite>

自:

Suite: SimpleCalculationsSuite
Test:Add 3+4
Passed:Text:The control text, 7, is correct.
Test:Fail 3-4
Failed:Text:The control text is not correct. Expected-7 Actual--1
Test:Error 3*4
Error:Click: The * button was not found

3 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

我不会在你的例子中使用相同的类,我将举一个自己的例子。

您需要实现方法public bool ShouldSerialize * Name *()其中Name是您希望控制序列化的属性的名称。

例如,我有这个课程:

[Serializable]
public class SerializeExample
{
    public string ResultType { get; set; }

    public string Error { get; set; }

    public string Failure { get; set; }

    public List<string> Steps { get; set; }

    public bool ShouldSerializeError()
    {
        return "Error".Equals(ResultType);
    }

    public bool ShouldSerializeFailure()
    {
        return "Failure".Equals(ResultType);
    }

    public bool ShouldSerializeSteps()
    {
        return ShouldSerializeError() || ShouldSerializeFailure();
    }
}

如果我有这个类实例:

SerializeExample ex1 = new SerializeExample { ResultType = "Success" };

然后,只有这个XML被序列化:

<SerializeExample>
  <ResultType>Success</ResultType>
</SerializeExample>

如果我创建另一个类并将其序列化:

SerializeExample ex2 = new SerializeExample { ResultType = "Error", Error = "Invalid data from user", Steps = new List<string>() };

然后,生成此XML。

<SerializeExample>
  <ResultType>Error</ResultType>
  <Error>Invalid data from user</Error>
  <Steps />
</SerializeExample>

答案 2 :(得分:0)

我最终修改了Test以包含错误列表。有了这个,我能够在XML文件中同时出现故障和错误节点。我还必须修改一些程序以允许这种情况发生。