加菲猫的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标签的属性中。
方式如下:
- 获取所有的Row标签
- 获取每行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