XNode node = XNodeParser.instance().parseFromText(loc, text);
|
XNode解析结果与DOM解析不同。DOM总是保留节点之间的空白节点。而XNode解析时如果两个节点之间只有空白文本,则该空白文本会被忽略。例如
<root> <child1/> <child2/> </root>
|
XNode解析得到的root节点,它具有两个子节点child1和child2。
2. 解析XML文件
XNode node = XNodeParser.instance().parseFromReource(resource); 或者
XNode node = ResourceHelper.readXml(resource);
|
3. 将XNode序列化为XML保存到文件中
ResourceHelper.writeXml(resource,node);e
|
4. 根据XDef元模型定义将XML文件解析为Java对象
new DslModelParser(xdefPath).parseFromResource(resource);
|
5. 递归遍历XNode的每一个节点
node.forEachNode(n-> process(n));
|
6. 常用函数
node.getTagName() node.getAttr(name) node.setAttr(name,value)
node.attrText(name) node.attrTextOrEmpty(name) node.attrInt(name) node.attrInt(name, defaultValue) node.attrBoolean(name) node.attrLong(name) node.attrCsvSet(name)
node.getAttrs() node.getChildren() node.childByTag(tagName) node.childByAttr(attrName, attrValue) node.getContentValue()
node.hasChild() node.hasAttr() node.hasContent() node.hasBody()
node.getParent()
node.cloneInstance()
list = node.cloneChildren()
node.detach()
node.remove()
node.replaceBy(newNode)
node.xml() node.innerXml()
node.toTreeBean()
XNode.fromTreeBean(treeBean)
|
7. XML和JSON之间的转换
node.toXJson()
node.toJsonObject()
|
标准格式规定如下:
- tagName 对应于 $type
- children和content 对应于 $body
- 属性直接对应于对象属性。
例如:
<div class='a'> <span /> </div>
|
转换为
{ "$type": "div", "class": "a", "$body": [ { "$type": "span" } ] }
|
XJson规定如下:
- 一般情况下属性和子节点都对应于对象属性
- 如果节点上标记了j:list=’true’表示当前节点对应于一个列表对象
- 如果节点名为
_
,则表示节点名被忽略
- 如果节点没有属性,且没有子节点,则它的内容作为它的值
- 如果节点具有j:key属性,则它替代节点名作为属性名
- 列表节点的子节点的tagName对应于type属性。但有个例外,如果节点名为
_
,则表示节点名被忽略
例如:
<root a="1"> <buttons j:list="true"> <button id="a" > <description>aa</description> </button> </buttons>
<options j:list="true"> <_>A</_> <_>B</_> </options> </root>
|
对应于
{ "type": "root", "a": "1", "buttons": [ { "type": "button", "id": "a", "description": "aa" } ], "options": ["A","B"] }
|