如何可视化XML文件

时间:2016-11-02 10:31:44

标签: xml

我在三年前找到了这个免费软件应用程序labytrinth(虽然它最后一次更新于2005年)。它允许作家组织他们故事中的角色和其他元素。人们可以创建元素然后将它们拖到窗口上,在窗口中可以用箭头连接不同的元素,添加关于关系性质的信息。

我的计算机最近崩溃了,虽然我没有丢失任何文件,因为一切都整齐备份,但我没有应用程序本身的副本。我从(habitualindolence.net)获取的网站已经消失(作为作家的有用用户发现了我),虽然我仍然想要找到任何可能仍然拥有它的人,但我的希望并不高。

尽管如此,我有文件(plt扩展名);现在我只需要想象它们。根据Writers用户的建议,我用记事本打开了文件,这给了我一个可读的代码。有人建议它可能是Python,但在线Python可视化器给出了语法错误。另一位用户提到它是一个XML文件。

有人可以推荐一种可视化代码的方法吗?这是前几行。如果您需要更长的摘录,请告诉我。

介绍部分:

<?xml version="1.0" encoding="utf-8"?>  
<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <SaveFormat>3.5</SaveFormat>
  <Name>TheNewWorld_01_AmbitiousPrince</Name>

列出字符的部分的细分:

      <Elements>
        <Element>
          <ID>f9434e21-d471-466f-948b-107f9da58905</ID>
          <Name>*Nyan Cleaner</Name>
          <Type>Character</Type>
          <Annotations>
            <TextAnnotation>
              <ID>dad71ecc-d38a-45e2-a695-d6ad0d679f57</ID>
              <Title>Physical Description</Title>
              <Content>Long, brown hair
    brown eyes
    lightly tanned skin
    </Content>
              <RTF>{\rtf1\ansi\ansicpg1252\deff0\deflang2070{\fonttbl{\f0    \fnil\fcharset0 Tahoma;}}
    \viewkind4\uc1\pard\f0\fs17 Long, brown hair\par
    brown eyes\par
    lightly tanned skin\par
    \par
    }
    </RTF>

具有'structures'标签的段将列出所有图表,每个图表('structure'标签)嵌套在'structures'标签中。

  <Structures>
    <Structure>
      <ID>dc1f9607-32d7-42ac-abcd-8b27e066eca2</ID>
      <Name>Nyan_Connections</Name>

'结构'块然后由具有位置的'节点'组成(参考带有字符名称的框)。 (请注意,以下部分会立即显示在上一个部分之后)

    <Nodes>
        <Node>
          <ElementID>43a45855-529d-48d6-ad33-3602abd5e57c</ElementID>
          <Position>
            <X>0.8034632</X>
            <Y>0.221544713</Y>
          </Position>
        </Node>
        <Node>
          <ElementID>aa94de7a-2241-4e41-a383-eadb070354d0</ElementID>
          <Position>
            <X>0.219047621</X>
            <Y>0.8678862</Y>
          </Position>

仍然在'结构'标签内,在'nodes'关闭后,您可以立即标记'链接'。这些是指连接上面不同节点的箭头。

  <Links>
        <Link>
          <ID>4eb83f93-2d47-4afc-bc46-dfa83a4f1f96</ID>
          <Description>Lovers</Description>
          <LHS>f9434e21-d471-466f-948b-107f9da58905</LHS>
          <RHS>c2b3f24d-c9f2-4832-b488-e1f3eca84b04</RHS>
          <Direction>Double</Direction>
        </Link>
        <Link>
          <ID>272dac28-a5f9-400c-a514-3aa9b971240f</ID>
          <Description>Friend</Description>
          <LHS>19f460ea-5ff9-4690-9adf-4b556489083e</LHS>
          <RHS>f9434e21-d471-466f-948b-107f9da58905</RHS>
          <Direction>Double</Direction>
        </Link>

关闭'结构'标签后,我们有时间线部分(绘制图表的位置,表格中,垂直上的字符;水平中的时间点或章节;以及文本在其他地方绘制。)

<Timelines>
    <Timeline>
      <ID>531b95f1-a07d-4aa8-ad2e-86576322f41b</ID>
      <Name>1-Ambitious_Ch02</Name>

这部分内容并不直观(至少对我而言)。它包括字符的标签(ElementIDs),章节(Points),然后是绘制的事件,标识每章中每个字符的内容(TimelinePoint)。

      <ElementIDs>
        <guid>f9434e21-d471-466f-948b-107f9da58905</guid>
        <guid>19f460ea-5ff9-4690-9adf-4b556489083e</guid>
        <guid>1ea36ec3-10e6-451d-a251-a139a51a6cfc</guid>
        <guid>c2b3f24d-c9f2-4832-b488-e1f3eca84b04</guid>
      </ElementIDs>
      <Points>
        <TimelinePoint>
          <ID>9699cb8e-367d-4119-936a-b43c3cf403e2</ID>
          <Name>scene1</Name>
          <UseSchedule>None</UseSchedule>
          <Schedule>0001-01-01T00:00:00</Schedule>
          <Items>
            <TimelineItem>
              <ID>63ca24bf-b278-4df3-a88f-4984cabc8404</ID>
              <ElementID>f9434e21-d471-466f-948b-107f9da58905</ElementID>
              <Annotation>
                <ID>c21bc9bb-7857-4099-97f4-14ef5b20b4f7</ID>
                <Title>Arrives to work</Title>
                <Content>She's late.</Content>
                <RTF>{\rtf1\ansi\ansicpg1252\deff0\deflang2070{\fonttbl{\f0\fnil\fcharset0 Tahoma;}}
\viewkind4\uc1\pard\f0\fs17 She's late.\par
}
</RTF>
              </Annotation>
            </TimelineItem>

是的,我想我可以打印所有这些,将elementID与字符匹配,以便确定哪个字符连接到哪个字符并手动“翻译”除了......数百个ID?它必须更快找到一种可视化的方法。

更不用说这种编码看起来非常直观且类似于HTML;我开始怀疑我是否应该只看到近乎灾难的白银并将其作为获取XML的动力?

编辑(回应菲利普的评论)

我使用该应用程序来组织角色并绘制一本涵盖5本书的奇幻故事。我有前4个完全计划和角色的关系注释。我需要找到一种方法来检索该信息。显然,我可以阅读代码来获取文本信息(字符列表等),但字符之间的关系是必不可少的,这就是我需要对其进行可视化的原因。这是一个例子:

enter image description here

2 个答案:

答案 0 :(得分:2)

好的,在再次考虑这个问题后,我有另一种方法。 对于要跟踪的所有ID,XSLT可能会变得很难。

我尝试使用python脚本和graphviz。 在您的示例中,我制作了一个如下的匿名示例文件:

<?xml version="1.0" encoding="utf-8"?>  
<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <SaveFormat>3.5</SaveFormat>
  <Name>TheNewWorld_01_AmbitiousPrince</Name>

  <Elements>
    <Element>
      <ID>f9434e21-d471-466f-948b-107f9da58905</ID>
      <Name>*Some One</Name>
      <Type>Character</Type>
    </Element>

    <Element>
      <ID>f9434e21-d471-466f-948b-107f9da58906</ID>
      <Name>*Some Other</Name>
      <Type>Character</Type>
    </Element>

    <Element>
      <ID>f9434e21-d471-466f-948b-107f9da58907</ID>
      <Name>A Third</Name>
      <Type>Character</Type>
    </Element>
  </Elements>

  <Structures>
    <Structure>
      <ID>dc1f9607-32d7-42ac-abcd-8b27e066eca2</ID>
      <Name>Some_Connections</Name>


    <Nodes>
        <Node>
          <ElementID>f9434e21-d471-466f-948b-107f9da58905</ElementID>
          <Position>
            <X>0.8034632</X>
            <Y>0.221544713</Y>
          </Position>
        </Node>
        <Node>
          <ElementID>f9434e21-d471-466f-948b-107f9da58906</ElementID>
          <Position>
            <X>0.219047621</X>
            <Y>0.8678862</Y>
          </Position>
        </Node>
        <Node>
          <ElementID>f9434e21-d471-466f-948b-107f9da58907</ElementID>
          <Position>
            <X>0.219047621</X>
            <Y>0.8678862</Y>
          </Position>
        </Node>
    </Nodes>
   <Links>
        <Link>
          <ID>4eb83f93-2d47-4afc-bc46-dfa83a4f1f96</ID>
          <Description>Lovers</Description>
          <LHS>f9434e21-d471-466f-948b-107f9da58905</LHS>
          <RHS>f9434e21-d471-466f-948b-107f9da58906</RHS>
          <Direction>Double</Direction>
        </Link>
        <Link>
          <ID>4eb83f93-2d47-4afc-bc46-dfa83a4f1f97</ID>
          <Description>Knows</Description>
          <LHS>f9434e21-d471-466f-948b-107f9da58905</LHS>
          <RHS>f9434e21-d471-466f-948b-107f9da58907</RHS>
          <Direction>Single</Direction>
        </Link>
   </Links>
    </Structure>
  </Structures>
</Project>

这个文件可以通过以下几行python转换为SVG:

import xml.etree.ElementTree
import graphviz

tree = xml.etree.ElementTree.parse('example.xml')
root = tree.getroot()

# read all the structures
for structure in root.findall('.//Structures/Structure'):
    structure_name = structure.findtext('./Name')
    graph = graphviz.Digraph(format='svg',comment='structure_name')

    # read the nodes of the structure
    for node in structure.findall('.//Nodes/Node'):
        node_element_id = node.findtext('./ElementID')
        # find the name
        element_name = root.findtext(".//Elements/Element[ID='{}']/Name".format(node_element_id))
        graph.node(node_element_id, element_name)

    # read the links
    for link in structure.findall('.//Links/Link'):
        id_1 = link.findtext('./LHS')
        id_2 = link.findtext('./RHS')
        description = link.findtext('./Description')
        direction = link.findtext('./Direction')
        graph.edge(id_1, id_2, label=description)
        if direction=='Double':
            graph.edge(id_2, id_1, label=description)

    graph.render(filename=structure_name)

这将创建一个SVG,其结构名称如下所示。

Result

通过在graphviz部分投入更多精力可能看起来更好。

时间表将是另一回事。

答案 1 :(得分:1)

您使用的应用程序之类的应用程序都有自己的自定义XML-Schemata。这意味着应用程序是唯一理解标签含义的东西。将XML解释为图表是应用程序中的自定义实现。

该应用使用此<SaveFormat>3.5</SaveFormat>来了解如何处理数据。

但是因为它是XML,我们可以使用XSLT将自定义XML转换为另一个应用程序可以理解的XML。这就是XSLT的用途。

听起来很可能。

我们需要一个目标应用程序,并逐步采取措施,使元素显示在那里忽略其余部分。