如何格式化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_fileoleobject 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 IFrdr = 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 IFwrt = 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 wrtRETURN ''