import {Attributes} from '../lang/Attributes';
import {StringBuffer} from '../lang/StringBuffer';
import {Node} from './Node';
import {XmlUtil} from './XmlUtil';
//==========================================================
// 节点工具类。
//
// @tool
// @author maocy
// @version 150104
//==========================================================
export class XmlNode extends Node {
//==========================================================
// 构造处理。
//==========================================================
public constructor(name: string = null) {
super(name);
}
//==========================================================
// 创建一个新的节点,并把这个节点放到父节点里。
//
// @method
// @param name:String 名称
// @param attribtues:TAttributes 属性集合
// @return TNode 返回新建的节点
//==========================================================
public create(name, attribtues) {
var xnode: any = new XmlNode();
xnode._name = name;
xnode._attributes = attribtues;
if (attribtues instanceof Attributes) {
var a = arguments;
var len = a.length;
for (var n = 1; n < len; n += 2) {
if (n + 1 < len) {
xnode.set(a[n], a[n + 1]);
} else {
xnode.setValue(a[n]);
}
}
}
this.push(xnode);
return xnode;
}
//==========================================================
// 构建配置文本。
//
// @method
// @param s:string:String 字符串对象
// @param l:level:Integer 层级
// @return String 构建成xml格式的字符串
//==========================================================
public innerXml(s, l) {
var o: any = this;
s.appendRepeat(' ', l);
s.append('<', o._name);
var as = o._attributes;
if (as) {
var ac = as.count();
for (var n = 0; n < ac; n++) {
s.append(' ', as.name(n), '="');
XmlUtil.buildText(s, as.value(n));
s.append('"');
}
}
if (!o._nodes && (o._value == null)) {
s.append('/');
}
s.append('>\n');
var ns = o._nodes;
if (ns) {
var c = ns.count();
for (var n = 0; n < c; n++) {
ns.get(n).innerXml(s, l + 1);
}
}
XmlUtil.buildText(s, o._value)
if (o._nodes || o._value != null) {
s.appendRepeat(' ', l);
s.append('', o._name, '>');
s.append('\n');
}
return s;
}
//==========================================================
// 构建配置文本。
//
// @method
// @return String 配置文本
//==========================================================
public xml() {
var xml = new StringBuffer();
this.innerXml(xml, 0);
return xml.flush();
}
//==========================================================
// 将构建成xml格式的字符串对象转换为字符串。
//
// @method
// @return String 字符串
//==========================================================
public toString() {
return this.xml().toString();
}
}