TypeScript Library XML - samchon/framework GitHub Wiki
#XML Tree-structured XML parser and generator. It's the most concise and eledic XML library.
class XML extends std.HashMap<string, XMLList>
{
protected tag: string;
protected value: string;
protected properties: std.HashMap<string, string>;
}
class XMLList extends std.Deque<XML>;
XML and XMLList are on right side.
XML object, it has three elements; tag, property and value.
<!-- TAG AND VALUE -->
<tag>value</tag>
<!-- TAG AND PROPERTY -->
<tag property_name="property_value" />
<!-- TAG, PROPERTY AND VALUE -->
<tag property_name="property_value">value</tag>
<!-- THIS IS AN XML OBJECT -->
<!-- THEY ARE BELONGED TO AN XML_LIST
<!-- THE TOP XML OBJECT -->
<!-- XML_LIST NAMED GUILD
<!-- XML_LIST NAMED MEMBER
Parsing XML string is very simple. Just create XML object with the string to parse.
/// <reference path="typings/samchon-framework/samchon-framework.d.ts" />
import library = require("samchon-framework").library;
function test_xml_parsing(): void
{
let str: string =
"<invoke listener='setMemberList'>\n" +
" <parameter name='application' type='string'>simulation</parameter>\n" +
" <parameter name='sequence' type='number'>3</parameter>\n" +
" <parameter type='XML'>\n" +
" <memberList>\n" +
" <member id='samchon' name='Jeongho Nam' mail='[email protected]' />\n" +
" <member id='github' name='GitHub' mail='[email protected]' />\n" +
" <member id='old_man' name='Old Kim' mail='[email protected]' />\n" +
" <member id='john' name='John Doe' mail='[email protected]' />\n" +
" <member id='robot' name='Alphago' />\n" +
" </memberList>\n" +
" </parameter>\n" +
"</invoke>";
// CREATE A NEW XML WITH THE STRING
let xml: library.XML = new library.XML(str);
}
Remeber that, XML extended std.HashMap<string, XMLList>
and XMLList extended std.Deque<XML>
.
You can use those methods in XML
- getTag() -> string
- getValue() -> string
- hasProperty(string) -> boolean
- getProperty(string) -> string
/// <reference path="typings/samchon-framework/samchon-framework.d.ts" />
import library = require("samchon-framework").library;
function test_xml_accessing(xml: library.XML): void
{
/////////////////////////////////////////
// ACCESS TO THE TAG "parameter"
/////////////////////////////////////////
// TEST WHETHER THE XML HAS CHILDREN XML TAGS NAMED "parameter"
console.log( xml.has("parameter") ); // true
let xmlList: library.XMLList = xml.get("parameter");
// GET VALUE OF THE FIRST PARAMETER
console.log( xmlList.at(0).getValue() ); // "simulation"
// GET VALUE OF THE SECOND PARAMETER
// NOTE, ALL THE VALUE AND PROPERTIES IN XML ARE 'STRING' TYPE
console.log( parseInt(xmlList.at(1).getValue()) ); // 3
// GET PROPERTY 'name' IN 2ND PARAMETER
console.log( xmlList.at(1).getProperty("name") ); // "sequence"
// TEST WHETHER 3RD PARAMETER HAS PROPERTY NAME
console.log( xmlList.at(2).hasProperty("name") ); // false
/////////////////////////////////////////
// ACCESS TO THE TAG "member" in "memberList"
/////////////////////////////////////////
// TEST WHETHER "memberList" AND "member" TAGS ARE
console.log( xml.has("memberList") ); // true
console.log( xml.has("memberList").at(0).has("member") ); // true
// IT'S IMPORTANT. ALTHOUGH ONLY A TAG NAMED "memberList" EXISTS,
// THE TAG ('XML') IS ALSO CAPSULED IN THE 'XMLList'
let members: library.XMLList = xml.get("memberList").at(0).get("member");
// ACCESSING TO THE [old_man]'s mail
console.log( members.at(2).getProperty("mail") ); // "[email protected]"
console.log( xml.get("memberList").at(0).get("member").at(2).getProperty("mail") ); // FROM TOP LEVEL'S XML
// NORMAL ITERATION
for (let i: number = 0; i < members.size(); i++)
if (xmlList.get(i).getProperty("id") == "old_man")
console.log( members.at(i).getProperty("mail") );
// ITERATION USING functions in <algorithm> of STL
let it: std.VectorIterator<XML> =
std.find_if
(
members.begin(), members.end(),
function (myXML: library.XML): boolean
{
return myXML.hasProperty("id") && myXML.getProperty("id") == "old_man";
}
);
if (it.equal_to(members.end()) == false)
console.log( it.value.getProperty("mail") ); // "[email protected]"
}
You can use such member setter in XML.
Now, we will generate a XML structure like below:
<document>
<id>F204-3312-3A2D</id>
<name>schedule</name>
<shapeList>
<shape type="circle" radius="5">
<point x="4" y="5" />
</shape>
<shape type="polyline">
<point x="10" y="12" />
<point x="14" y="27" />
<point x="19" y="24" />
</shape>
<shape type="polygon">
<outer type="polyline">
<point x="2" y="-14" />
<point x="4" y="5" />
<point x="-3" y="0" />
<point x="9" y="6" />
<point x="7" y="4" />
</outer>
<inner>
<shape type="polyline">
<point x="1.2" y="1.5" />
<point x="1.5" y="1.7" />
<point x="1.1" y="0.9" />
</shape>
<shape type="polyline">
<point x="1.1" y="1.1" />
<point x="1.2" y="0.9" />
<point x="1.3" y="1.2" />
</shape>
</inner>
</shape>
</shapeList>
</document>
We can generate the XML structure by manually following step by step.
/// <reference path="typings/samchon-framework/samchon-framework.d.ts" />
import library = require("samchon-framework").library;
function test_xml_generation(): void
{
////////////
// CONSTRUCT TOP LEVEL XML ELEMENT
////////////
let xml: library.XML = new library.XML();
xml.setTag("document");
xml.insertValue("id", "F204-3312-3A2D");
xml.insertValue("name", "schedule");
// CREATE SHAPE_LIST TEMPORAILY
let shapeList: library.XML = new library.XML();
shapeList.setTag("shapeList");
// INSERT SHAPE_LIST TO THE TOP LEVEL'S
xml.push(shapeList);
////////////
// CONSTRUCT SHAPE ELEMENTS
////////////
// CONSTRUCT CIRCLE
let circle: library.XML = new library.XML();
circle.setTag("shape");
circle.setProperty("type", "circle");
circle.setProperty("raidus", 5);
let circle_point: library.XML = new library.XML();
circle_point.setTag("point");
circle_point.setProperty("x", 4);
circle_point.setProperty("y", 5);
circle.push(circle_point); // INSERT TO CIRCLE
shapeList.push(circle); // INSERT TO SHAPE_LIST
// CONSTRUCT POLYLINE
let polyline: library.XML = new library.XML();
polyline.setTag("shape");
polyline.setProperty("type", "polyline");
let polyline_p1: library.XML; // ...
let polyline_p2: library.XML; // ...
let polyline_p3: library.XML; // ...
polyline.push(polyline_p1, polyline_p2, polyline_p3); // INSERT POINTS INTO POLY_LINE
shapeList.push(polyline); // INSERT POLYLINE INTO THE SHAPE_LIST
/* REPEAT THOSE SCRIPTS TO POLYGON ...
--------------------------------------------------------------------------
AS YOU CAN SEE, TYPING ALL FEATURES IS VERY TIRESOME.
YOU CAN OMIT MOST OF THOSE PROCESSES BY USING ENTITY MODULE.
LOOK BELOW, I INTRODUCE THE ENTITY MODULE IN SAMCHON-FRAMEWORK.
--------------------------------------------------------------------------
*/
console.log(xml.toString()); // UPPER document.xml WILL BE PRINTED OUT
}
As you can see, generating XML structure by yourself is very tough and annoying work. You can generate and parse XML much easier with the Entity Module.