如何格式化XML文件为缩进样式?

如何格式化XML文件为缩进样式?

虽然Powerbuilder从9.0开始提供对XML文件的操作,但本人一直用8.0作为主要的开发工具,所以操作XML时只能通过OLE调用DOM控件。使用Microsoft.XMLDOM直接导出(SaveAs)的XML文件没有缩进,用写字板打开时全部挤在第一行,不好编辑;关键在于后续的开发中由于超长的“一行”数据,导致了错误。后来,在互联网上振翅的蝴蝶的blog上看到了格式化缩进XML文档,有现成的代码格式化XML文档。稍作改动,美化了XML,如下:

//==============================================================================
// 函数: uvo_ysjk::uf_format_xml()
//------------------------------------------------------------------------------
// 描述: 格式化XML文件
//------------------------------------------------------------------------------
// 参数:
//valuestringas_fileXML文件名
//------------------------------------------------------------------------------
// 返回值: 成功返回'',失败返回非空字符串。
//------------------------------------------------------------------------------
// 作者:blackeys日期: 2006年12月04日
//------------------------------------------------------------------------------
// 修改历史:
//1、2006年12月04日 创建
//------------------------------------------------------------------------------
// ××××开发组
//==============================================================================
String ls_err,ls_xmlfile
Int i,li_rtn
ls_xmlfile = as_file

oleobject xmldoc,rdr,wrt
xmldoc = CREATE oleobject
li_rtn = xmldoc.ConnectToObject('microsoft.xmldom')
IF li_rtn <> 0 THEN li_rtn = xmldoc.ConnectToNewObject("Microsoft.XMLDOM")
IF li_rtn <> 0 THEN
DESTROY xmldoc
RETURN '调用microsoft.xmldom失败!'
END IF
xmldoc.async = FALSE
xmldoc.load(ls_xmlfile)
IF xmldoc.parseError.errorCode <> 0 THEN
DESTROY xmldoc
RETURN '解析错误'+ ls_err
END IF

rdr = CREATE oleobject
li_rtn = rdr.ConnectToObject('MSXML2.SAXXMLReader')
IF li_rtn <> 0 THEN li_rtn = rdr.ConnectToNewObject("MSXML2.SAXXMLReader")
IF li_rtn <> 0 THEN
DESTROY xmldoc
DESTROY xmldoc
RETURN '调用MSXML2.SAXXMLReader失败!'
END IF

wrt = CREATE oleobject
li_rtn = wrt.ConnectToObject('MSXML2.MXXMLWriter')
IF li_rtn <> 0 THEN li_rtn = wrt.ConnectToNewObject("MSXML2.MXXMLWriter")
IF li_rtn <> 0 THEN
DESTROY xmldoc
DESTROY rdr
DESTROY wrt
RETURN '调用MSXML2.MXXMLWriter失败!'
END IF
String xmlHeader,xmlBody
xmlHeader=xmldoc.childNodes[0].xml; //在开始解析前保存xml头
wrt.indent = true;
rdr.contentHandler = wrt;
rdr.parse(xmldoc);
xmldoc.loadXML(wrt.output);
long xmlChildLength
xmlChildLength=xmldoc.childNodes.length;
xmlBody='';
for i = 1 to xmlChildLength - 1
xmlBody = xmlBody + xmldoc.childNodes[i].xml;
if mod(i,100) = 0 then //DOM需要占用大量内存,PB调用时更为如此,所以循环做垃圾回收
GarbageCollect ( )
end if
next
xmldoc.loadXML(xmlHeader + xmlBody);
xmldoc.save(ls_xmlfile);

DESTROY xmldoc
destroy rdr
destroy wrt

RETURN ''