1

对于我们被告知的任务,对于附加功能输出图形,可以使用 GraphViz。这就是我们得到的所有信息。

分配是 perl 输出 XML。我很确定我可以输出代码,我只需要知道如何从那里处理它。

我做了一些研究,我一直在尝试测试一些简单的代码。

对于 DOTML,我从http://www.martin-loetzsch.de/DOTML/找到了这个简单的示例

<graph  file-name="graphs/nice_graph" rankdir="LR">

    <node   id="a" label="node1" fontsize="9" fontname="Arial"/>
    <node   id="b" label="node2" fontsize="9" fontname="Arial"/>
    <node   id="c" label="node3" fontsize="9" fontname="Arial"/>
    <node   id="d" label="node4" fontsize="9" fontname="Arial"/>
    <edge   from="a" to="b" fontname="Arial" fontsize="9" label="edge1"/>
    <edge   from="a" to="c" fontname="Arial" fontsize="9" label="edge2"/>
    <edge   from="b" to="c" fontname="Arial" fontsize="9" label="edge3"/>
    <edge   from="b" to="d" fontname="Arial" fontsize="9" label="edge4"/>
    <edge   from="c" to="d" fontname="Arial" fontsize="9" label="edge5"/>
</graph>

我试图用这个从命令行运行它

dot -Tps graph1.dot -o graph1.ps 

dot -Tps graph1.dot -o graph

引发此错误

Error: graph_test.dotml:1: syntax error near line 1
context: <graph         file-name="graph" >>>  rankdir="LR"> <<<

我也对graphml文件进行了同样的尝试,这是文件的头

<?xml version="1.0" encoding="UTF-8"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns
     http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd">
  <graph id="G" edgedefault="undirected">

基本上会引发相同的错误

Error: simple.graphml:1: syntax error near line 1
context: <?xml version="1.0" >>>  encoding="UTF-8"?> <<

如果有人至少可以指导我在哪里获得一些好的,关于如何实现它的基本说明会很好。干杯

编辑:我们只能使用默认的 CPAN 模块

4

1 回答 1

0

您需要将 GraphML 转换为 DOT。您可以在此处获得一个完整的 XSLT 样式表:

http://graphml.graphdrawing.org/download.html

要转换您作为示例发布的 XML 图,您可以使用这样的 XSLT 样式表(它非常有限,只能用于非常简单的图 - 我将其用作教学示例):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="text"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="graph|digraph">
        <xsl:value-of select="name()"/>
        <xsl:text> {&#xa;</xsl:text>
        <xsl:apply-templates select="@rankdir|node()"/>
        <xsl:text>}</xsl:text>
    </xsl:template>

    <xsl:template match="@rankdir">
        <xsl:text>rankdir = </xsl:text>
        <xsl:value-of select="."/>
        <xsl:text>;&#xa;</xsl:text>
    </xsl:template>

    <xsl:template match="node">
        <xsl:value-of select="@id"/>
        <xsl:if test="@*[not(name()='id')]">
            <xsl:text> [</xsl:text>
            <xsl:for-each select="@*[not(name()='id')]">
                <xsl:value-of select="name()"/>
                <xsl:text>=&quot;</xsl:text>
                <xsl:value-of select="."/>
                <xsl:text>&quot;</xsl:text>
                <xsl:if test="not(position()=last())">
                    <xsl:text>, </xsl:text>
                </xsl:if>
            </xsl:for-each>
            <xsl:text>];&#xa;</xsl:text>
        </xsl:if>
    </xsl:template>

    <xsl:template match="edge">
        <xsl:value-of select="@from"/>
        <xsl:choose>
            <xsl:when test="parent::*[name()='graph']">
                <xsl:text> -- </xsl:text>
            </xsl:when>
            <xsl:otherwise>
                <xsl:text> -> </xsl:text>
            </xsl:otherwise>
        </xsl:choose>
        <xsl:value-of select="@to"/>
        <xsl:if test="@*[not(name()='from')][not(name()='to')]">
            <xsl:text> [</xsl:text>
            <xsl:for-each select="@*[not(name()='from')][not(name()='to')]">
                <xsl:value-of select="name()"/>
                <xsl:text>=&quot;</xsl:text>
                <xsl:value-of select="."/>
                <xsl:text>&quot;</xsl:text>
                <xsl:if test="not(position()=last())">
                    <xsl:text>, </xsl:text>
                </xsl:if>
            </xsl:for-each>
            <xsl:text>];&#xa;</xsl:text>
        </xsl:if>
    </xsl:template>

</xsl:stylesheet>

在这个小提琴中,我使用它将您的 GraphML 文档转换为 DOT 文档,您可以将其与命令行 DOT 应用程序一起使用:

graph {
rankdir = LR;
a [label="node1", fontsize="9", fontname="Arial"];
b [label="node2", fontsize="9", fontname="Arial"];
c [label="node3", fontsize="9", fontname="Arial"];
d [label="node4", fontsize="9", fontname="Arial"];
a -- b [fontname="Arial", fontsize="9", label="edge1"];
a -- c [fontname="Arial", fontsize="9", label="edge2"];
b -- c [fontname="Arial", fontsize="9", label="edge3"];
b -- d [fontname="Arial", fontsize="9", label="edge4"];
c -- d [fontname="Arial", fontsize="9", label="edge5"];
}

将上面的代码重命名为something.dot并使用 Graphviz 运行它,或者dot它应该生成一个图形。

您可以使用Lib::XSLT CPAN 模块运行 XSLT。

于 2014-05-26T04:45:20.313 回答