# JSON与XML当今最流行的两种数据格式,猫猫教你用VFP解析他们
准备环境: JSON解析用,木瓜大侠的FOXJSON库 XML解析类,系统一般自带 VFP SP2 7423 如果想要这些文件,请关注加菲猫的VFP,发送“JSON”就可以获取下载链接。
# JSON与XML的概念
JSON: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。可在不同平台之间进行数据交换。JSON采用兼容性很高的、完全独立于语言文本格式,同时也具备类似于C语言的习惯。 XML: 扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。
请记住,他们就是字符串。
# 键值对表示法
JSON 使用键/值对的字符串来表示数据{键:值}
{"name":"张三","age":"20"}
1
可以表示一个姓名,年龄的信息
XML用标签来表示
<preson>
<name>张三</name>
<age>20</age>
</preson>
1
2
3
4
2
3
4
# vfp来创建JSON
1.方法一
cXML=[{"name":"张三","age","20"}]
1
它就是字符串嘛,简单的构建就这样完成了。
2.方法二:使用木瓜的foxjson
oUser=Createobject("foxJson")
oUser.Append("name","张三")
oUser.Append("age",20)
?oUser.ToString()
1
2
3
4
2
3
4
# VFP如何解析这个字符串?
cJosn='{"name":"张三","age":"20"} '
oJSON=foxjson_parse(cJson)
?oJson.item("name")
?oJson.item("age")
1
2
3
4
2
3
4
# vfp来创建JSON数组
oUsers=Createobject("foxJson",{})
oUser=Createobject("foxJson")
oUser.Append("name","张三")
oUser.Append("age",20)
oUsers.Append(oUser)
oUser=Createobject("foxJson")
oUser.Append("name","李四")
oUser.Append("age",18)
oUsers.Append(oUser)
?oUser.toString()
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# VFP解析JSON数组
cJson='[{"name":"张三","age":20},{"name":"李四","age":8}] '
oUsers=foxjson_parse(cJson)
?"记录数",oUsers.count
?oUsers.item(1).item("name")
?oUsers.item(1).item("age")
?oUsers.item(2).item("name")
?oUsers.item(2).item("age")
1
2
3
4
5
6
7
2
3
4
5
6
7
# vfp来创建xml
1.方法一
cXML=[<preson><name>张三</name><age>20</age></preson>]
1
2.方法二:
oXMLDOC=Createobject("Microsoft.XMLDOM")
oPerson= oXMLDOC.createElement("person")
oName=oXMLDOC.createElement("name")
oName.Text="张三"
oAge=oXMLDOC.createElement("age")
oAge.Text=20
oPerson.appendchild(oName)
oPerson.appendchild(oAge)
?oPerson.XML
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 建立一个XML数组
oXMLDOC=Createobject("Microsoft.XMLDOM")
oPersons=oXMLDOC.createElement("persons")
&&加个S表示多个
oPerson= oXMLDOC.createElement("person")
oName=oXMLDOC.createElement("name")
oName.Text="张三"
oAge=oXMLDOC.createElement("age")
oAge.Text=20
oPerson.appendchild(oName)
oPerson.appendchild(oAge)
oPersons.appendchild(oPerson)
oPerson= oXMLDOC.createElement("person")
oName=oXMLDOC.createElement("name")
oName.Text="李四"
oAge=oXMLDOC.createElement("age")
oAge.Text=25
oPerson.appendchild(oName)
oPerson.appendchild(oAge)
oPersons.appendchild(oPerson)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# VFP解析XML
TEXT TO lcXML NOSHOW TEXTMERGE
<preson><name>张三</name><age>20</age></preson>
ENDTEXT
oXMLDOC=Createobject("Microsoft.XMLDOM")
oXMLDOC.loadxml(lcXML )
?"共有子标签:",oxmldoc.documentElement.childNodes.length
oxmlHeader=oxmldoc.documentElement.childNodes.Item(0)
&&childNodes里有两个标签 分别是name ,age
?oxmlHeader.text &&里面的值
?oxmlHeader.xml &&连同标签
?oxmlHeader.nodename &&标签名
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
通过childNodes 一级一级往下
XML 是无限多级的
上级的childNodes 存放下级标签有多少个,分别是什么
xml是一颗倒置的树,如果每一个节点都要输出,那得用编历算法(我研究完就忘记了,递归算法)
oNode=getElementsByTagName("name")
通过xmldoc的getElementsByTagName方法可以将所有同名的标签全部抓出来变成一个集合
# 使用另一个大招getElementsByTagName
TEXT TO lcXML NOSHOW TEXTMERGE
<preson><name>张三</name><age>20</age></preson>
ENDTEXT
oXMLDOC=Createobject("Microsoft.XMLDOM")
oXMLDOC.loadxml(lcXML )
oXMLHeaders=oXMLDOC.getElementsByTagName("name")
?"标签集合共有",oxmlHeaders.length
?oxmlHeaders.item(0).text &&里面的值
?oxmlHeaders.item(0).xml &&连同标签
?oxmlHeaders.item(0).nodename &&标签名
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11