Skip to content

Instantly share code, notes, and snippets.

@dorneanu
Created June 10, 2021 11:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dorneanu/906facb9aa2eb88c51dd348cdeaddf97 to your computer and use it in GitHub Desktop.
Save dorneanu/906facb9aa2eb88c51dd348cdeaddf97 to your computer and use it in GitHub Desktop.
Convert miMind XML exports to JSON
module mimind2json
go 1.16
require github.com/beevik/etree v1.1.0
github.com/beevik/etree v1.1.0 h1:T0xke/WvNtMoCqgzPhkX2r4rjY3GDZFi+FjpRZY2Jbs=
github.com/beevik/etree v1.1.0/go.mod h1:r8Aw8JqVegEf0w2fDnATrX9VpkMcyFeM0FhwO62wh+A=
package main
import (
"flag"
"fmt"
"log"
"strings"
"github.com/beevik/etree"
)
// Defines maximum level of indentation where current node should be treated
// as a heading
var maxHeadingsLevel int
func parseTree(e *etree.Element, treeLevel int) {
for _, n := range e.SelectElements("Node") {
title := n.SelectAttrValue("Title", "unknown")
char := "*"
var indent string
// For first 3 indentation levels use headings
// For the rest rest number of indentation
if treeLevel <= maxHeadingsLevel {
char = "!"
indent = strings.Repeat(char, treeLevel)
} else {
indent = strings.Repeat(char, treeLevel-maxHeadingsLevel)
}
fmt.Printf("%s %s\n", indent, title)
parseTree(n, treeLevel+1)
}
}
func main() {
var xmlFile string
flag.IntVar(&maxHeadingsLevel, "hl", 3, "Specify max heading indentation level")
flag.StringVar(&xmlFile, "f", "", "Specify XML file")
flag.Parse()
if len(xmlFile) == 0 {
log.Fatalf("No XML file specified")
}
// Read in XML file
doc := etree.NewDocument()
if err := doc.ReadFromFile(xmlFile); err != nil {
panic(err)
}
// Select root element
root := doc.SelectElement("Root")
content := root.SelectElement("Content")
parseTree(content, 1)
}
@dorneanu
Copy link
Author

How it works:

$ head Ernährungskompass.xml
<Root>
<Header info="Created with miMind software."></Header>
<Content>
<Node Title="Ernährungskompass">
<Node Title="Kapitel 1">
<Node Title="Der Eiweisseffekt">
<Node Title="Tiere sind auf Proteinsuche bis sie ihren Proteinbedarf gedeckt haben"></Node>
<Node Title="Zu viele Proteine sind auch nicht gut, da sie den Alterungsprozess begünstigen"></Node>
</Node>
<Node Title="Insektenforscher">

$ go run main.go -hl 1 -f Ernährungskompass.xml | head
! Ernährungskompass
* Kapitel 1
** Der Eiweisseffekt
*** Tiere sind auf Proteinsuche bis sie ihren Proteinbedarf gedeckt haben
*** Zu viele Proteine sind auch nicht gut, da sie den Alterungsprozess begünstigen
** Insektenforscher
*** Stephen Simpson
*** David Raubenheimer
*** Forschung
**** Haben herausgefunden, dass Mormonengrille sich gegenseitig fressen wg Proteinbedarf

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment