0

我正在构建一些基本 SVG 元素的非常粗略的实现。我想将对象序列化为可用的 XML 流。大部分细节我都可以接受,但由于某种原因,我陷入了可以包含一个或多个相同类型对象的对象类型(“g)”的基础知识上。

这是一个精简的示例:

<svg>
  <g display="inline">
    <g display="inline">
        <circle id="myCircle1"/>
        <rectangle id="myRectangle1"/>
    </g>
    <circle id="myCircle2"/>
    <rectangle id="myRectangle2"/>
  </g>
</svg>

第一个“g”元素包含其他 g 元素。设计该对象的最佳方法是什么?

[XMLTypeOf("svg")]
public class SVG
{
    public GraphicGroup g {set; get;}
}

public GraphicGroup
{
   public GraphicGroup g {set; get;}
   public Circle circle { set; get;}
   public Rectangle rectangle { set; get;}
}

public Circle...
public Rectangle...

这不太正确,甚至不接近。有任何想法吗?

4

3 回答 3

2

很抱歉,我不知道 C# 与 XML 的耦合XMLTypeOf(从何而来?没有出现在 MSDN 搜索中),但也许从公开常见 DOM 属性(如 id、style)的 SVGElement 派生就足够了。 ..并添加缺少的声明:

public class SVGElement
{
  public String id {set; get;}
  public String style {set; get;}
}

[XMLTypeOf("svg")]
public class SVG : public SVGElement
{
    public GraphicGroup g {set; get;}
}

[XMLTypeOf("g")]
public class GraphicGroup : public SVGElement
{
   public GraphicGroup g {set; get;}
   public Circle circle { set; get;}
   public Rectangle rectangle { set; get;}
}

[XMLTypeOf("circle")]
public class Circle : public SVGElement { ... }

[XMLTypeOf("rectangle")]
public class Rectangle : public SVGElement { ... }
于 2012-06-05T06:26:40.350 回答
1

使用多态性:

public interface IGraphic
{
    void Draw();
}

public class SVG
{
    public GraphicGroup GraphicGroup { get; set; }
}

public class GraphicGroup : IGraphic
{
    public GraphicGroup(Collection<IGraphic> graphics)
    {
        this.Graphics = graphics;
    }

    public Collection<IGraphic> Graphics { get; private set; }

    public void Draw()
    {
        Console.WriteLine("Drawing Graphic Group");
        foreach (IGraphic graphic in this.Graphics)
        {
            graphic.Draw();
        }
    }
}

public class Circle : IGraphic
{
    public void Draw()
    {
        Console.WriteLine("Drawing Circle");
    }
}
于 2012-06-05T07:24:48.190 回答
0

使用 xsd 和 xsd 编写代码生成器

于 2012-06-05T03:04:03.620 回答