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