C#XML序列化:属性和命名空间

时间:2018-03-07 16:32:56

标签: c# xml serialization xml-namespaces

在日志结构中,我有一个状态列表,在每个状态中,有几个字段,每个字段都有一些属性。其中一些字段具有相同名称的属性,但具有不同的类型,即int与float。注意'时间戳'此特定示例中的属性:

public class DroneState
{
    [XmlAttribute("timestamp")]
    public int timestamp;

    ...
}

public class SensorState
{
    [XmlAttribute("timestamp")]
    public float timestamp;

    ...
}

public class CombinedState
{
    [XmlElement("DroneState")]
    public DroneState droneState = null;
    [XmlElement("Sensor")]
    public SensorState sensorState = null;
}

public class FlightLog
{
    [XmlElement("States"), XmlArrayItem("State")]
    public List<CombinedState> states = new List<CombinedState>();

    public static void SaveToFile(FlightLog flightLog, string file)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(FlightLog));
        string xml = string.Empty;
        // serialize and return string
        using (StringWriter writer = new StringWriter())
        {
            serializer.Serialize(writer, flightLog);
            xml = writer.ToString();
        }

        File.WriteAllText(file, xml);
    }
}

使用此代码生成XML文档,我遇到以下异常:

  

InvalidOperationException:名为&#39; timestamp&#39;的XML属性来自命名空间&#39;&#39;已存在于当前范围内。使用XML属性为属性指定另一个XML名称或命名空间。

这是我本可以预期的,但我似乎无法解决它。无论我尝试为每个属性添加命名空间,它都会抱怨属性是在&#39;&#39;中分配的。命名空间。

确保每个timestamp属性都放在自己的命名空间中需要采取哪些步骤?

2 个答案:

答案 0 :(得分:0)

您可以为不同的签名/类型提供不同的属性名称

var editor = CKEDITOR.replace( 'editor1', {});
editor.on( 'instanceReady', function( evt ) {
    editor.on( 'dialogShow', function( evt ) {
        evt.data.definition.dialog.hide();
    });                 
    editor.execCommand('find');
}); 

或timestampDrone / timestampSensor。

答案 1 :(得分:0)

在上面发布的代码中,没有定义实际问题。它编译并运行良好,我虽然这是我认为遇到的问题的最小例子。我发现问题的原因是2个字段写入相同的属性,这使得抛出异常的原因。这完全是由于我缺乏监督造成的。

提供问题的代码:

[XmlAttribute("timestamp")]
public long timestamp;

[Quite a bit of other members...]

[XmlAttribute("timestamp")]
public float acceleration;

acceleration成员写入适当的属性可以解决问题。