Stenway Developer Network

SML in Java

Prerequisites

The source code of the Stenway SML reference library can be found on GitHub

Video

Examples

Empty root element:

SmlElement rootElement = new SmlElement("MyRootElement");
SmlDocument document = new SmlDocument(rootElement);

Serialize an SML document:

SmlElement rootElement = new SmlElement("MyRootElement");
SmlDocument document = new SmlDocument(rootElement);

String str = document.toString();

Message example:

SmlElement message = new SmlElement("Message");
message.addAttribute("From", "Andrew");
message.addAttribute("To", "James");
message.addAttribute("Timestamp", "2021-01-02", "15:43");
message.addAttribute("Text", "I'll be there at 5pm");

SmlDocument document = new SmlDocument(message);

Save as SML file:

SmlElement message = new SmlElement("Message");
message.addAttribute("From", "Andrew");
message.addAttribute("To", "James");
message.addAttribute("Timestamp", "2021-01-02", "15:43");
message.addAttribute("Text", "I'll be there at 5pm");

SmlDocument document = new SmlDocument(message);

document.save("Message1.sml");

Load an SML file:

SmlDocument document = SmlDocument.load("Message1.sml");

Get value:

SmlDocument document = SmlDocument.load("Message1.sml");

String from = document.getRoot().attribute("From").getString();

Load an SML file as WSV document:

WsvDocument wsvDocument = WsvDocument.load("Message1.sml");

String wsvStr = wsvDocument.toString();

SmlDocument smlDocument = SmlDocument.parse(wsvStr);

Load an SML file and change it:

SmlDocument document = SmlDocument.load("Config.sml");

SmlElement videoElement = document.getRoot().element("Video");

SmlAttribute resolutionAttribute = videoElement.attribute("Resolution");
resolutionAttribute.setValues(1920, 1080);
resolutionAttribute.setComment(" Changed");

if (!videoElement.hasAttribute("VSync")) {
    videoElement.addAttribute("VSync", true);
}

Save a localized file:

SmlElement message = new SmlElement("Message");
message.addAttribute("De", "André");
message.addAttribute("À", "Jacques");
message.addAttribute("Horodatage", "2021-01-02", "15:43");
message.addAttribute("Texte", "Je serai là à 5 heures");

SmlDocument document = new SmlDocument(message);

document.setEndKeyword("Fin");

document.save("Français.sml");

Load a localized SML file:

SmlDocument document = SmlDocument.load("Français.sml");

Naming:

SmlDocument document = SmlDocument.load("FileList.sml");

SmlAttribute[] images = document.getRoot().attributes("Image");
SmlAttribute[] videos = document.getRoot().attributes("Video");

for (SmlAttribute image : images) {
    String imageFilePath = image.getString();
    ...
}

Null value and empty string:

SmlElement rootElement = new SmlElement("MyRootElement");
rootElement.addAttribute("MyFirstAttribute", "-", null, "");

Multi-line string:

SmlElement rootElement = new SmlElement("MyRootElement");
rootElement.addAttribute("MyFirstAttribute", "Line1\nLine2\nLine3");

rootElement.addAttribute("MySecondAttribute", """
        Line1
        Line2
        Line3""");

rootElement.addAttribute("MyThirdAttribute",
        ReliableTxtDocument.join("Line1", "Line2", "Line3"));

Indentation-insensitive:

SmlElement rootElement = new SmlElement("MyRootElement");
SmlElement group1Element = rootElement.addElement("Group1");
group1Element.addAttribute("MyFirstAttribute", 123);
group1Element.addAttribute("MySecondAttribute", 10, 20, 30, 40, 50);
rootElement.addAttribute("MyThirdAttribute", "Hello world");

SmlDocument document = new SmlDocument(rootElement);

document.setDefaultIndentation("");

Streaming

Read an SML file node by node:

try (SmlStreamReader reader = 
        new SmlStreamReader("Big.sml")) {
    SmlNode node = null;
    while ((node = reader.readNode()) != null) {
        ...
    }
}

Write an SML file node by node:

SmlDocument template = new SmlDocument("MyRootElement");
try (SmlStreamWriter writer = 
        new SmlStreamWriter(template, "Big.sml", 
                ReliableTxtEncoding.UTF_16, true)) {
    writer.writeNode(new SmlElement("MyElement"));
    writer.writeNode(new SmlAttribute("MyAttribute", "Value"));
}