XML转换为VFP的临时表,简简单单很好用,值得收藏

加菲猫的VFP 2022-01-04 11:02:25

加菲猫的VFP|狐友会社群的蓝天纺织发来求助,说我有一个XML不知道如何转换为表。

虽然前面有写了XML就是字符串,也教了用Microsoft.XMLDOM来解析,但这次的格式有点点不同,我没有讲过,于是猫猫就出手了,就有了今天的文章。

XML和JSON为异构系统传输的两大数据格式,而相当一部分狐友不知道XML和JSON如何解析,前面很多文章都讲了JSON怎么处理,相比而下,XML的文章比较少。
在现在的混合开发时间,一定要掌握这两种格式的解析。

蓝天纺织发来的XML格式。

<?xml version="1.0" encoding="GB2312"?>
<Data INFO="YIKAIFAPIAO">
    <YKFP>
        <Row 发票号码="272531" 开票日期="2021-12-22" 客户名称="嘉兴市纺织有限公司" 价税合计="2954.5" 发票代码="211130" 合计金额="2614.6" 税额="339.9"/>
        <Row 发票号码="272530" 开票日期="2021-12-18" 客户名称="吴江市纺织品有限公司" 价税合计="100000" 发票代码="211130" 合计金额="88495.57" 税额="11504.43"/>
        <Row 发票号码="272529" 开票日期="2021-12-10" 客户名称="苏州纺织品科技有限公司" 价税合计="52000" 发票代码="211130" 合计金额="46017.7" 税额="5982.3"/>
        <Row 发票号码="272528" 开票日期="2021-12-10" 客户名称="苏州纺织品科技有限公司" 价税合计="100000" 发票代码="211130" 合计金额="88495.58" 税额="11504.42"/>
        <Row 发票号码="272527" 开票日期="2021-12-10" 客户名称="吴江丝绸贸易有限公司" 价税合计="48000" 发票代码="211130" 合计金额="42477.88" 税额="5522.12"/>
        <Row 发票号码="272526" 开票日期="2021-12-10" 客户名称="苏州纺织有限公司" 价税合计="100000" 发票代码="211130" 合计金额="88495.58" 税额="11504.42"/>
        <Row 发票号码="272525" 开票日期="2021-12-10" 客户名称="吴江市纺织有限公司" 价税合计="35123.2" 发票代码="211130" 合计金额="31082.48" 税额="4040.72"/>
        <Row 发票号码="272524" 开票日期="2021-12-07" 客户名称="吴江市纺织有限公司" 价税合计="35123.2" 发票代码="211130" 合计金额="31082.48" 税额="4040.72"/>
    </YKFP>
</Data>

XML跟HTML很相似,都是标签式声明语言,可以看到标签里面的有很多Rows标签,而于我们平常见不到的是,它所有的数据都放在Row标签的属性中。

方式如下:

  1. 获取所有的Row标签
  2. 获取每行Row中的所有属性

开始解析XML,重点是属性是么处理

利用getElementsByTagName方法来获取所有的Row标签
然后得到每行标签的所有属性
属性也是有属性名和属性值的
发票号码="272525",发票号码为属性名,272525为属性值。
这里有个地方要注意:
oxmldoc.LoadXML 是加载XML内容
oxmldoc.Load 是加载XML文件
两者不同,不要用错了,加载成功会返回.T.

遍历输出所有的发票数据

cXml="上面的XML"
oxmldoc=Createobject("Microsoft.XMLDOM")
?oxmldoc.LoadXML(cXml)  &&xml文件用load, 内容用loadxml
oRowtag=oxmldoc.getElementsByTagName("Row")
For i=0 To oRowtag.Length-1
    ?"属性长度",oRowtag.item(i).Attributes.length    
    FOR j=0 TO oRowtag.item(i).Attributes.length-1
       ?oRowtag.Item(i).Attributes.Item(j).nodeName    &&属性名
       ?oRowtag.Item(i).Attributes.Item(j).Text  &&属性值
    ENDFOR 
Endfor

接下就是建个临时表,一行一行写入临时表就完成解析啦,这里的代码我就不帮你写啦。

解析XML标签的另一种数据表示方法

XML数据格式如下,这次的数据不是放在属性中,而是放在标签之中,所以解析起来只有一层,更容易。

   <Fp>
    <Djh></Djh>
    <Fpzl>增值税专用发票</Fpzl>
    <Lbdm>211130</Lbdm>
    <Fphm>272525</Fphm>
    <Kprq>20211210</Kprq>
    <Gfmc>吴江市纺织有限公司</Gfmc> 
   </Fp>
TEXT TO lcXML NOSHOW TEXTMERGE 
   <Fp>
    <Djh></Djh>
    <Fpzl>增值税专用发票</Fpzl>
    <Lbdm>211130</Lbdm>
    <Fphm>272525</Fphm>
    <Kprq>20211210</Kprq>
    <Gfmc>吴江市纺织有限公司</Gfmc> 
   </Fp>
ENDTEXT 

oxmldoc=Createobject("Microsoft.XMLDOM")
?oxmldoc.LoadXML(lcXML)  &&xml文件用load, 内容用loadxml
oRowtag=oxmldoc.getElementsByTagName("Fp")
?oRowtag

For i=0 To oRowtag.Length-1    
   ?oRowtag.Item(i).nodeName    &&属性名
   ?oRowtag.Item(i).Text  &&属性值    
Endfor

都给遍历输出来了,接下写临时表,就不用猫猫代劳了吧。

然后我也封装一个类库,专门应对单表转换模式,这样的话,祺佑三层开发框架对XML和JSON的支持就比较完善了。

原创不易,大家动动手指 收藏、点赞、在看!
更多资料http://www.sn58.cn/

...全文
165 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

2,749

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧