前言 在FineReport中,提供了一套简单的API用于读写XML操作,在这套关键的API中,主要的用到的关键类就是XMLableReader和XMLPrintWriter。从类的名字可以看出,XMLableReader是用于读取XML的,而XMLPrintWriter则是用于写XML的。 示例我们以实际的示例来看这两个类的使用,示例代码以自定义的网页框为例子,源码在这里,下面就以这个额自定义控件中设计到读取XML的部分代码为例子进行具体的讲解。先来看一下在表中添加了一个网页框控件后,表单的XML文件(frm文件)中关于这个控件的XML片段: 网页框控件XML片段
[size=1em]1
2
3
4
5
6
7
8
9
10
11
12
13
| <InnerWidget class="com.fr.plugin.form.widget.core.RHIframe">
<WidgetName name="rHIframe0"/>
<WidgetAttr>
<PrivilegeControl/>
</WidgetAttr>
<Attr scrollX="true" scrollY="true"/>
<RHIframeAttr class="com.fr.plugin.form.widget.core.RHIframeAttr">
<RHIframeSource class="com.fr.plugin.form.widget.core.TemplateSource">
<Attr path="/mark.cpt"/>
</RHIframeSource>
<Parameters/>
</RHIframeAttr>
</InnerWidget>
|
其中第1行到第5行是网页框控件父类提供的一些属性,我们暂时不用管,我们把关注点集中在第5行以后。 写XML来对照着网页框控件的源码来看看,由于我们只关注读写XML,所以这里的片段就只贴读写XML相关的部分: writeXML
[size=1em]1
2
3
4
5
6
7
8
9
10
11
12
| @Override
public void writeXML(XMLPrintWriter writer) {
super.writeXML(writer);
writer.startTAG("Attr");
writer.attr("scrollX", overflowX);
writer.attr("scrollY", overflowY);
writer.end();
if (attr != null) {
GeneralXMLTools.writeXMLable(writer, attr, RHIframeAttr.XML_TAG);
}
}
}
|
writeXML中第4行到第7行,就写出了上面XML片段中的Attr
[size=1em]<Attr scrollX="true" scrollY="true"/>
|
而writeXML中第8行到底10行,则写出了上面XML片段中的 RHIframeAttr
[size=1em]<RHIframeAttr class="com.fr.plugin.form.widget.core.RHIframeAttr">
<RHIframeSource class="com.fr.plugin.form.widget.core.TemplateSource">
<Attr path="/mark.cpt"/>
</RHIframeSource>
<Parameters/>
</RHIframeAttr>
|
综合上述示例,可以看到给XML节点写入属性,是用XMLPrintWriter#attr方法,而要把一个对象写入到XML,则推荐使用GeneralXMLTools#writeXMLable方法。 读XML对应于写XML,我们在把XML转化为对象的时候,就需要读XML,我们来看一下示例中的网页框控件的读XML方法 readXML
[size=1em]1
2
3
4
5
6
7
8
9
10
11
12
13
| @Override
public void readXML(XMLableReader reader) {
super.readXML(reader);
if (reader.isChildNode()) {
String nodeName = reader.getTagName();
if ("Attr".equals(nodeName)) {
this.overflowX = reader.getAttrAsBoolean("scrollX", true);
this.overflowY = reader.getAttrAsBoolean("scrollY", true);
} else if (RHIframeAttr.XML_TAG.equals(nodeName)) {
this.attr = (RHIframeAttr) GeneralXMLTools.readXMLable(reader);
}
}
}
|
不管是Attr节点也好,还是RHIframeAttr节点也好,它们都属于InnerWidget的子节点,所以执行带网页框控件的readXML方法中时,我们需要判断是否读到了孩子节点(reader.isChildNode),如果是,则根据节点名字读取实际的XML内容。读取属性的方法大致都是这样的格式: [size=1em]XMLableReader#getAttrAsXXX();
|
读取对象则可以使用内置的工具方法 [size=1em]GeneralXMLTools#readXMLable(XMLableReader);
|
如果希望进一步了解和学习嵌套XML的读写,可以进一步参考RHIframe对象的属性RHIframeAttr的XML读写,参考上面的讲解,应该可以更加深刻的了解。 其他文本节点读写TextNode
[size=1em]<Text><![CDATA[My Text]]></Text>
|
其中的CDATA标记是为了防止XML文本中出现了特殊字符导致XML无法解析 上面的XML,写的方式为: 写文本节点
[size=1em]writer.startTAG("Text");
writer.textNode("My Text");
writer.end();
|
对应的,读取的方式为: 读文本节点
[size=1em]if ("Text".equals(nodeName)) {
String text = reader.getElementValue();
}
|
注意事项写XML的时候,XMLPrintWriter#startTAG方法和XMLPrintWriter#end方法一定要成对出现,否则就会写出下面这样的XML 损坏的XML
[size=1em]<Text><![CDATA[My Text]]>
|
这样会导致整个XML无法解析,模板也就无法正确读取了。 源地址:http://www.finedevelop.com/pages/viewpage.action?pageId=1933555
|