DSL将根元素添加到序列化

时间:2009-08-13 10:23:29

标签: dsl dsl-tools

我正在寻求帮助以实现以下目标

图表代表汽车,用户可以添加引擎和颜色

当我查看XML时,它看起来像这样:

<Car>
  <Engine>BigEngine</Engine>
  <Colour>Pink</Colour>
</Car>

我想做的是将汽车包裹在“车辆”内,即

<Vehicle>
  <Car>
    <Engine>BigEngine</Engine>
    <Colour>Pink</Colour>
  </Car>
</Vehicle>

我不确定实现这一目标的最佳方法。我希望模型资源管理器和生成的XML包含在“车辆”中,但是对于所有其他意图和目的,用户只能使用汽车

信息:2010年的Visual Studio 2010,C#和DSL SDK

2 个答案:

答案 0 :(得分:0)

我会尝试两种不同的方法:


1st:覆盖DSL Package类DocData  在DocData.cs文件和覆盖方法

protected override void OnDocumentSaved(System.EventArgs e)

然后我会创建包装器

之后我在DocData.cs中重写

protected override void OnDocumentLoading(System.EventArgs e)

在调用基本方法base.OnDocumentLoading(e);之前,我会从文件中删除。


第二名:在DSL Explorer下,转到XML序列化行为并设置Car Domain Class“Is Custom = true”。

这个解决方案不是直截了当的,但并不像第一时那样复杂。您必须定义每个方法,但是对于每个自定义方法,您可以调用名为“DefaulMethod”的DSL生成方法,该方法具有默认的DSL序列化程序行为。


我目前正在使用VS 2005,所以有些事情可能已经改变了......

答案 1 :(得分:0)

我已通过以下方式解决了这个问题。我正在双重推导Car类,在Car序列化器中我正在这样做:

写出额外的元素:

  public partial class CarSerializer : CarSerializerBase
{
    public override void Write(SerializationContext serializationContext, ModelElement element, XmlWriter writer, RootElementSettings rootElementSettings)
    {
        // Adds the Model and LobSystem root elements to match that required by the SharePoint BCS
        writer.WriteStartElement("Garage");
        writer.WriteStartElement("Cars");
        base.Write(serializationContext, element, writer, rootElementSettings);
        writer.WriteEndElement();
        writer.WriteEndElement();
    }
}

为了能够读回来,我正在覆盖SerializationHelper中的Car LoadModel方法以及它在哪里获取读者我正在读取元素,直到我到达Car。

...

XmlReader reader = XmlReader.Create(fileStream, settings);
reader.MoveToContent();
while (!reader.EOF && !reader.Name.Equals("Car"))
{
   reader.Read();
}

reader = reader.ReadSubtree();

//    using (global::System.Xml.XmlReader reader = global::System.Xml.XmlReader.Create(fileStream, settings))
using (reader)
{

...