0

我一直在寻找这个,但找不到任何东西。

我正在尝试使用 C# 中的 Quickgraph 从 GraphML 反序列化图形。这是我用来表示顶点和边的类

[Serializable]
public class Room
{
    public Room(int id, double x, double y)
    {
        this.Ids = id;
        this.x = x;
        this.y = y;
    }

    [XmlAttribute("id")]
    public int Ids { get; set; }

    [XmlAttribute]
    public double x { get; set; }

    [XmlAttribute]
    public double y { get; set; }

}

[Serializable]
public class HouseEdge<TVertex> : Edge<TVertex>
{
    public string Name { get; set; }

    public HouseEdge(TVertex source, TVertex target)
        : base(source, target)
    {
    }
}

我正在尝试使用 DeserializeFromGraphML 方法反序列化代码:

XmlReader xreader = getXMLReader("//house.xml");
IdentifiableVertexFactory<Room> ivf = new IdentifiableVertexFactory<Room>(makeTest);
IdentifiableEdgeFactory<Room, HouseEdge<Room>> ief = new IdentifiableEdgeFactory<Room, HouseEdge<Room>>(makeTest2);
graph.DeserializeFromGraphML<Room, HouseEdge<Room>, AdjacencyGraph<Room, HouseEdge<Room>>>(xreader, ivf, ief);
xreader.Close();

这是 makeTest 和 makeTest2 的代码:

private Room makeTest(string cos)
{
    MessageBox.Show(cos);
    return new Room(11, 12.0, 13.0);
}

private HouseEdge<Room> makeTest2(Room one, Room two, string cos)
{
    MessageBox.Show(cos);
    return new HouseEdge<Room>(one, two);
}

所以 - 在我的 XML 文件中,我得到了 2 个顶点 - (0,0,0) 和 (1,1,1) 以及它们之间的边缘。当我反序列化它们时,边缘很好,但顶点变为(0,12,0)和(1,12,1)。必须有一些我遗漏的东西(12 个来自 makeTest 方法),但cos变量只有数字零和一个,就像图中“顶点”中的顶点位置一样(这就是我在 MessageBox 中显示的内容)

我知道乍一看可能很复杂,但也许真的很简单?我错过了什么吗?

提前致谢!

4

2 回答 2

0

根据我的研究,这是库中的一个错误(或者有更多人无法正确使用该库)。 是图书馆论坛上的讨论之一,其他人遇到与我相同的问题。

正因为如此,我在 LINQ to XML 中创建了一个代码并手动完成 - 它的工作方式就像在普通 XML 中导航一样。要记住的一件事是使用正确的 XName,因为使用字符串作为元素名称根本不起作用。例如:

XName XNgraph = XName.Get("graph", "http://graphml.graphdrawing.org/xmlns");
var edges = xelement.Elements(XNgraph)

如果你和我有同样的问题,祝你好运——希望我能帮到你一点:)

于 2014-03-23T18:30:21.560 回答
0

我今天发现了同样的问题,并在找到这篇文章之前找到了一个不同的解决方法,以防它对任何人有用。

当我检查 GraphMLSerializer 的 XML 输出时,我注意到在我漂亮地打印 xml 之后它正在正确反序列化(我使用 Notepad++ 插件使 XML 更易于阅读)。所以我实际上通过对我的序列化代码进行轻微更改来解决它,向我的 XmlWriter 添加一些设置,以便它可以漂亮地打印它发出的 XML:

using (XmlWriter writer = XmlWriter.Create(filename, new XmlWriterSettings { 
        Indent = true,
        WriteEndDocumentOnClose = false
    })) {

    this.SerializeToGraphML<StoryNode, Choice, StoryArcGraph>(writer, 
        v => v.Id,
        e => e.Id
        );
}

我的项目只加载它自己发出的 XML,额外的格式化字符并没有过多的开销,所以我发现这是一个可以接受的解决方法。

于 2014-04-02T23:30:22.230 回答