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

加菲猫的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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

加菲猫的VFP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值