Skip to main content
Version: Next

XML Schema

XML suits stable types maintained by engineers (base libraries, complex inheritance trees) and can coexist with Excel schema. One XML file can hold enum / bean / table together; you need not split into three files as with Excel.

In luban.conf, leave the directory or file type empty:

{"fileName": "Defines", "type": ""}

Complete small example​

<module name="item">

<enum name="Quality">
<var name="WHITE" alias="白" value="1"/>
<var name="GREEN" alias="绿" value="2"/>
<var name="BLUE" alias="蓝" value="3"/>
</enum>

<bean name="Cost">
<var name="id" type="int#ref=item.TbItem"/>
<var name="count" type="int"/>
</bean>

<bean name="Item">
<var name="id" type="int"/>
<var name="name" type="string"/>
<var name="quality" type="Quality"/>
<var name="price" type="int" group="c,s"/>
</bean>

<table name="TbItem" value="Item" index="id" input="item/item.xlsx"/>
<table name="TbItemExtra" value="Item" index="id" input="item/item_extra.xlsx"/>

<refgroup name="item_tables" ref="item.TbItem,item.TbItemExtra"/>

<module name="equip">
<bean name="Equip">
<var name="id" type="int"/>
<var name="slot" type="int"/>
</bean>
<table name="TbEquip" value="Equip" input="item/equip.xlsx"/>
</module>

</module>

Full names generated in the example are roughly: item.Quality, item.Item, item.TbItem, item.equip.TbEquip.

module​

AttributeDescription
nameNamespace; may be empty; may be multi-level like a.b; may nest child <module>

Root modules often use <module name=""> for global vectors etc. (see sample project builtin.xml).

enum​

<enum name="OpenFlag" flags="1" unique="1" comment="开关">
<var name="None" value="0"/>
<var name="A" value="1"/>
<var name="B" value="2"/>
<var name="AB" value="A|B"/>
</enum>
Attribute / childDescription
flags / uniqueBit flags; unique item values
var.name / alias / valueItem name, fill-in alias, explicit value
mapperMap to an external enum type (see below)

bean​

<!-- Value type + default separator: data can write 1,2,3 -->
<bean name="vec3" valueType="1" sep=",">
<var name="x" type="float"/>
<var name="y" type="float"/>
<var name="z" type="float"/>
</bean>

<!-- Ordinary composite type -->
<bean name="Reward">
<var name="item_id" type="int"/>
<var name="num" type="int"/>
<var name="desc" type="string" group="c"/>
</bean>
AttributeDescription
nameType name (without namespace; namespace comes from the outer module)
parentParent class; short names resolve in this module first, then globally
valueTypeValue-type semantics
sepDefault separator for compact/stream filling
aliasAlias for polymorphism and similar scenarios

Fields: <var name="..." type="..." group="..." comment="..." tags="..."/>.
Type forms: see Type cheat sheet.

Nested child beans = polymorphism​

<bean name="Shape">
<bean name="Circle" alias="圆">
<var name="radius" type="float"/>
</bean>
<bean name="Rect" alias="矩形">
<var name="width" type="float"/>
<var name="height" type="float"/>
</bean>
</bean>

Child <bean> nested inside a parent bean automatically get that parent as parent. You can also write them flat:

<bean name="Shape"/>
<bean name="Circle" parent="Shape">
<var name="radius" type="float"/>
</bean>

See Polymorphism.

table​

<table name="TbItem" value="Item" index="id" input="item.xlsx"/>
<table name="TbNotKeyList" value="NotKeyList" mode="list" input="list.xlsx"/>
<table name="TbUnion" value="UnionRow" index="key1+key2" input="union.xlsx"/>
<table name="TbGlobal" value="GlobalConfig" mode="one" input="global.xlsx"/>
<table name="TbFromHeader" value="FromHeader" readSchemaFromFile="1" input="from_header.xlsx"/>
AttributeDescription
name / valueTable name, row bean
inputMultiple sources comma-separated; Sheet@file.xlsx; directory
indexa / a+b / a,b
modemap / list / one
readSchemaFromFileRead bean from data table header (do not also define same-named bean in XML)
group / output / comment / tagsSame semantics as Excel schema

refgroup / constalias / mapper (summary)​

<!-- Multi-table ref sugar: field writes #ref=item_tables -->
<refgroup name="item_tables" ref="item.TbItem,item.TbItemExtra"/>

<constalias name="ITEM_GOLD" value="1001"/>

<bean name="vec2" valueType="1" sep=",">
<var name="x" type="float"/>
<var name="y" type="float"/>
<mapper target="client" codeTarget="cs-bin">
<option name="type" value="UnityEngine.Vector2"/>
<option name="constructor" value="ExternalTypeUtil.NewVector2"/>
</mapper>
</bean>
ElementPurpose
refgroupA set of full table names usable by #ref=
constaliasConstant aliases usable in data
mapperMap enum/bean to external types (by target / codeTarget); see TypeMapper

When to use XML​

Better for XMLBetter for Excel schema
Base types, few changesBusiness tables add fields often
Deep inheritance, engineer reviewDesigners also need to see structure tables
Git-diff friendlyKept next to fill-in data files