0

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

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

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

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

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

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

我不确定实现这一目标的最佳方法。我希望将模型浏览器和生成的 XML 包装在“车辆”中,但对于所有其他意图和目的,用户仅使用汽车

信息:Visual Studio 2010、C# 和 DSL SDK for 2010

4

2 回答 2

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)
{

……

于 2009-09-23T15:20:43.970 回答
0

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


第一种:覆盖 DSL 包类 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,所以有些事情可能已经改变了......

于 2009-08-18T09:41:32.973 回答