我正在寻求帮助以实现以下目标
图表代表汽车,用户可以添加引擎和颜色
当我查看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
答案 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)
{
...