zoukankan      html  css  js  c++  java
  • Python-Json字符串和XML解析

    Python-json字符串和xml解析

          JSON:JavaScript Object Notation(JavaScript 对象表示法)

    JSON是存储和交换文本信息的语法,类似XML

    JSON比XML更小,更快,更易解析。

    1、JSON语法与语法规则

    JSON语法是JavaScript语法的子集。

    JSON语法是JavaScript对象表示语法的子集。

    • 数据在名称/值对中
    • 数据由逗号分隔
    • 花括号保存对象
    • 方括号保存数组

    1.1:JSON对象

    JSON对象是保存在花括号中的。对象可以包含多个名称/值对。例如

    { "firstName":"John" , "lastName":"Doe" }

    这等价于JavaScript语句:

                firstName=”Jonh”

                lastname=”Doe”

    1.2:JSON数组

    JSON数组是保存在方括号[]中的。数组可以包含多个对象。例如

          {

               “employees”:[

                     {“firstName”:”John”,”lastName”:”Doe”},

                     {“firstName”:”Anna”,”lastName”:”Smith”},

                     {“firstName”:”Petter”,”lastName”:”Jones”}

    ]

    }

    在上述例子中,数组”employees”包含三个对象,每一个对象代表一条记录

    2、Python操作JSON

    Python2.6开始加入了json模块,Python的json模块系列化和反序列化分别是dumps和loads。对简单的数据类型可以直接处理,如:string,Unicode,int,float,list,tuple,dict

    json.dumps():将一个Python对象编码成JSON字符串。

    json.loads():将JSON格式字符串解码成Python对象。

     

    2.1:Json编码

    使用json.dumps()方法来将一个Python数据类型列表编码成json格式的字符串

    #coding=utf-8

    import json

    a = [{1:12, 'a':12.3}, [1,2,3], (1,2), 'asd', u'ad',12,13L,3.3,True,False,None]

    print u"Python类型: ", a

    print u"编码后的json串: ",json.dumps(a)

    #执行结果

    E:>python 0328test.txt

    Python类型:

    [{'a': 12.3, 1: 12}, [1, 2, 3], (1, 2), 'asd', u'ad', 12, 13L, 3.3, True, False,None]

    编码后的json串:

    [{"a": 12.3, "1": 12}, [1, 2, 3], [1, 2], "asd", "ad", 12, 13, 3.3, true, false,null]

    观察打印结果,会发现Python对象被转换成JSON字符串之后,跟原始的输出结果相比有一些特殊的变化;在json编码的过程中,会存在从Python原始类型转化为json类型的过程,这两种语言的类型存在一些差异

     

     

    2.2:json.dumps()

           函数原型:

    dumps(obj,skipkeys=False,ensure_ascii=True,check_circular=True,allow_nan=True,cls=None,indent=None,separators=None,encoding='utf-8',d

    efault=None,sort_keys=False,**kw)

           该方法返回编码后的一个json字符串,是一个str对象encodedjson

          dumps函数的参数非常的多,常用参数介绍如下:

          sort_keys:是否按字典排序(a-z)输出,默认为False,默认编码成json格式字符串后是紧凑输出,并且也没有顺序,不利于可读。示例如下:

    #coding=utf-8

    import json

    a = [{"a":"A", "b":(2,3),"c":3.0}]

    print json.dumps(a)

    print json.dumps(a,sort_keys=True)

    #执行结果

    E:>python 0328test.txt

    [{"a": "A", "c": 3.0, "b": [2, 3]}]

    [{"a": "A", "b": [2, 3], "c": 3.0}]

           indent:设置参数缩进的空格数。缩进显示 使读起来更加清晰。例如:

    #coding=utf-8

    import json

    a = [{"a":"A", "b":(2,3),"c":3.0}]

    print json.dumps(a)

    print json.dumps(a,sort_keys=True,indent=4)

    #执行结果

    E:>python 0328test.txt

    [{"a": "A", "c": 3.0, "b": [2, 3]}]

    [

        {

            "a": "A",

            "b": [

                2,

                3

            ],

            "c": 3.0

        }

    ]

    separators:中文意思:分离器;参数的作用是去掉逗号”,”和分号”;”后面的空格,为了美化输出结果,在输出数据时逗号和分号后面都有空格,但是在传输数据的过程中越精简越好,就可以使用separators对传输的json串进行压缩。该参数是元组格式的,例如:

    #coding=utf-8

    import json

    a = [{"a":"A", "b":(2,3),"c":3.0}]

    print json.dumps(a)

    print json.dumps(a,separators=(",",";"))

    #执行结果

    E:>python 0328test.txt

    [{"a": "A", "c": 3.0, "b": [2, 3]}]

    [{"a";"A","c";3.0,"b";[2,3]}]       #明显有了缩短

             skipkeys:在encoding过程中,dict对象的key只可以是基本数据类型(str,Unicode,int,long,float,bool,None),如果是其他类型,那么在编码过程中就会抛出TypeError的异常。skipkeys可以跳过那些非string对象key的处理,就是不处理。例如:

    #coding=utf-8

    import json

    data= [ { 'a':'A', 'b':(2, 4), 'c':3.0, (1,2):'D tuple' } ]

    print u"不设置skipkeys参数"

    try :

        res1 = json.dumps(data) #skipkeys参数默认为False时

    except Exception,e:

        print e

    print u"设置skipkeys参数"

    print json.dumps(data,skipkeys=True) # skipkeys=True时

    #执行结果

    E:>python 0328test.txt

    不设置skipkeys参数

    keys must be a string

    设置skipkeys参数

    [{"a": "A", "c": 3.0, "b": [2, 4]}]

    ensure_ascii:表示编码使用的字符集,默认是True,表示使用ascii码进行编码。如果设置为False,就会以Unicode进行编码。由于解码json字符串时返回的就是Unicode字符串,所以可以直接操作Unicode字符,然后直接编码Unicode字符串,这样会简单些

    2.3:Jsoon解码json.loads()

    将json格式字符串解码成Python对象,使用json.loads()函数,可以将简单数据类型解码成Python对象,例如

    #coding=utf-8

    import json

    a = [{1:12, 'a':12.3}, [1,2,3], (1,2), 'asd', u'ad', 12, 13L, 3.3, True, False, None]

    print u"编码后 ", json.dumps(a)

    print u"解码后 ", json.loads(json.dumps(a))

    #执行结果

    E:>python 0328test.txt

    编码后

    [{"a": 12.3, "1": 12}, [1, 2, 3], [1, 2], "asd", "ad", 12, 13, 3.3, true, false, null]

    解码后

    [{u'a': 12.3, u'1': 12}, [1, 2, 3], [1, 2], u'asd', u'ad', 12, 13, 3.3, True, False, None]

          Json格式的字符串解码成Python对象以后,String类型都变成了Unicode类型,数组变成了list,不会回到原来的元组类型,字典key的字符类型也被转成Unicode类型。从json到Python的类型转化

    2.4:将类对象编码成json串

          Python中的dict对象可以直接序列化为json的{},但是很多时候,可能用class表示对象,比如定义Animals类,然后直接去系列化就会报错。因为类不是一个可以直接序列化的对象,我们需要用dumps()函数中的default参数来实现。

    #coding=utf-8

    import json

    class Animals(object):

        def __init__(self,name,sex,weight):

            self.name=name

            self.sex=sex

            self.weight=weight

        #将序列化函数定义到类里面

        def obj_json(self,obj_instance):

            return{

                "name":obj_instance.name,

                "sex":obj_instance.sex,

                "weight":obj_instance.weight}

    #实例化

    D=Animals("dog","man","30kg")

    print json.dumps(D,default=D.obj_json)

    #执行结果

    E:>python py.txt

    {"name": "dog", "weight": "30kg", "sex": "man"}

    相对于上面这种方法,还有一种更为简单的方法,通常class及其实例都会有一个__dict__属性(除非类中添加了__slots__属性),它是一个dict类型,存储的是类或者类实例中有效的属性。

    #coding=utf-8

    import json

    class Animals(object):

        def __init__(self,name,sex,weight):

            self.name=name

            self.sex=sex

            self.weight=weight

        #将序列化函数定义到类里面

        def obj_json(self,obj_instance):

            return{

                "name":obj_instance.name,

                "sex":obj_instance.sex,

                "weight":obj_instance.weight}

    #实例化

    D=Animals("dog","man","30kg")

    print D.__dict__

    print json.dumps(D,default=lambda Animals:Animals.__dict__)

    print json.dumps(D,default=lambda D:D.__dict__)

    执行结果

    E:>python py.txt

    {'name': 'dog', 'weight': '30kg', 'sex': 'man'}

    {"name": "dog", "weight": "30kg", "sex": "man"}

    {"name": "dog", "weight": "30kg", "sex": "man"}

    2.4:将Json反序列化为类对象

    json串反序列化成类对象或类的实例,使用的是loads()方法中的object_hook参数来实现。

    #coding=utf-8

    import json

    class Animals(object):

        def __init__(self,name,sex,weight):

            self.name=name

            self.sex=sex

            self.weight=weight

    #实例化

    D=Animals("dog","man","30kg")

       

    def JsonToClass(D):

        return Animals(D["name"],D["sex"],D["weight"])

    json_str='{"name":"cat","sex":"woman","weight":"5kg"}'

    d=json.loads(json_str,object_hook=JsonToClass)

    print d

    print d.name

    #执行结果

    E:>python py.txt

    <__main__.Animals object at 0x00000000026F2898>

    cat

    3、Xml

    XML指可扩展标记语言(Extensible Markup Language)

    XML被设计用于结构化、存储和传输数据

    XML是一种标记语言,很类似于HTML

    XML没有像HTML那样具有预定义标签,需要程序员自己定义标签

    XML被设计为具有自我描述性,并且是W3C的标准

    3.1:XML文档(树结构)

          XML文档形成了一种树结构,他从“根部”开始,然后扩展到“树枝”。

          XML文档必须包含根元素,该元素是所有其他元素的父元素,文档中的所有元素形成了一颗文档树,这棵树从根开始,扩展到树的最顶端,并且所有的元素都可以有子元素。

          父元素拥有子元素,相同层级上的子元素成为同胞(兄弟或姐妹)。

          XML中所有元素都可以有文本内容和属性,类似于HTML。

    <root>

    <child>

    <subchild>....</subchild>

    </child>

    </root>

    3.2:XML元素&语法规则

             XML的元素是指从开始标签直到结束标签的部分(均包括开始结束)。

          一个元素可以包含:其他元素、文本、属性

          所有的XML元素都必须有一个开始标签和结束标签,省略结束标签是非法的,如

    <root> content </root>

          XML标签对大小写敏感,区分大小写,比如,下面是两个不同的标签

    <Note>this is a test1</Note>

    <note>this is a test2</note>

          XML文档必须有根元素。如:

    <note>

    <b>this is a test2</b>

    <name>joy</name>

    </note>

             XML必须正确嵌套,父元素必须完全包住子元素

          XML属性值必须加引号,元素的属性值都是一个键值对形式,如

    <book category=" Python"></book>        

    注意:book元素中的属性category的值是python必须用引号引起来,使用单引号和双引号都可以,但是如果属性值本身包含双引号,外层就必须使用单引号;但如果包含了单引号,外层必须使用双引号

    3.2.1:XML命名规则

             名称可以包含字母、数字和其他字符

          名称不能以数字或者标点符号开头

          名称不能以字母xml或者XML开始

          名称不能包含空格

          可以使用任何名称,没有保留字

          名称应该具有描述性,简短和简单,可以同时使用下划线

          避免使用“-”“.”“:”等字符

          XML注释格式为:<!--注释内容-->

    3.2.2:CDATA

    CDATA(Unparsed Character Data)指的是不应由Xml解析器进行解析的文本数据,因为Xml解析器会将”<”(新元素的开始)和”&”(字符实体的开始)解析成具有特殊含义的字符,所以在文本中需要使用这些字符时,就必须使用实体引用去代替。但是有些文本,如JavaScript代码中会包含大量的”<”和”&”符号,这时我们可以将我们的脚本定义为CDATA来避免这个问题,因为XML文档中的所有文本均会被解析器解析,只有CDATA部分中所有的内容会被XML解析器忽略。

    CDATA固定语法格式:<![CDATA[]”我们自己的代码”]>,如下示例

    <script>

    <![CDATA[

    function test(x, y)

    {   if (x < 0 && y < 0) then

        {

            return 0;

        }

        else

        {

            return 1;

        }}

    ]]>

    </script>

             注意:CDATA部分不能包含字符串”]]>”,并且]]>之间不能有空格或者折行等支付,如果包含了,会以为是CDATA的结束。也不允许嵌套CDATA部分

    3.3:Python解析XML三种方法

    1.SAX(simple API for XML):python标准库中包含SAX解析器,SAX使用的是事件驱动模型,通过在解析XML过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件。

    解析基本过程:读到一个XML开始标签,就会开始一个事件,然后事件就会调用一系列的函数去处理一些事情,当读到一个结束标签时,就会触发另一个事件,所以如果XML文档有格式错误的话,解析就会出错。这是一种流式处理,一边读一边解析,速度比较快,占用内存少,但是需要用户实现回调函数(handler)

    2.DOM(Document Object Model):DOM,他是以对象树来表示一个XML文档的方法,使用它的好处就是你可以非常灵活的在对象中进行遍历。将XML数据在内存中解析成一个树,通过对树的操作来操作XML。由于DOM是将XML读取到内存,然后解析成一个树,一般比较慢,而且比较消耗内存,所以DOM一般偏向于处理一些小的XML,如配置文件

    3.ElementTree(Object Model):ElementTree就像一个轻量级的DOM,具有方便而友好的API。代码的可用性好、速度快,消耗内存少,可以认为是对DOM的改进。

    3.3.1使用xml.dom解析xml

    #XML文档内容movie.xml

    """

    <?xml version="1.0" encoding="utf-8" ?>

    <!--this is a test about xml.-->

    <collection shelf="New Arrivals">

    <movie title="Enemy Behind">

        <type>War, Thriller</type>

        <format>DVD</format>

        <year>2003</year>

        <rating>PG</rating>

        <stars>10</stars>

        <description>Talk about a US-Japan war</description>

    </movie>

    <movie title="Transformers">

        <type>Anime, Science Fiction</type>

        <format>DVD</format>

        <year>1989</year>

        <rating>R</rating>

        <stars>8</stars>

        <description>A schientific fiction</description>

    </movie>

        <movie title="Trigun">

        <type>Anime, Action</type>

        <format>DVD</format>

        <episodes>4</episodes>

        <rating>PG</rating>

        <stars>10</stars>

        <description>Vash the Stampede!</description>

    </movie>

    <movie title="Ishtar">

        <type>Comedy</type>

        <format>VHS</format>

        <rating>PG</rating>

        <stars>2</stars>

        <description>Viewable boredom</description>

    </movie>

    </collection>

    """

    minidom.parse(parser=None,bufsize=None):此函数的作用是使用parse解析器打开xml文档,并将其解析为DOM文档,也就是内存中的一棵树,并得到这个DOM对象。

    #coding=utf-8

    #从xml.dom.minidom模块引入解析器parse

    from xml.dom.minidom import parse

    import xml.dom.minidom

    #minidom解析器打开xml文档并将其解析为内存中的一棵树

    DOMTree= xml.dom.minidom.parse(r"e:movie.xml")

    print type(DOMTree)

    执行结果

    E:>python py.txt

    <type 'instance'>

    doc.documentElement:获取XML文档对象,就是拿到DOM树的根。

    #coding=utf-8

    #从xml.dom.minidom模块引入解析器parse

    from xml.dom.minidom import parse

    #minidom解析器打开xml文档并将其解析为内存中的一棵树

    DOMTree= parse(r"e:movie.xml")

    #获取XML文档对象,也就是树的根节点

    collection=DOMTree.documentElement 

    print collection

    执行结果

    E:>python py.txt

    <DOM Element: collection at 0x2771e48>

             doc.toxml(encoding=None):获取XML文档函数,返回xml的文本内容

    #coding=utf-8

    #从xml.dom.minidom模块引入解析器parse

    from xml.dom.minidom import parse

    #minidom解析器打开xml文档并将其解析为内存中的一棵树

    DOMTree= parse(r"e:movie.xml")

    #获取XML文档对象,也就是树的根节点

    collection=DOMTree.documentElement 

    print u"DOM树的根对象:",collection

    print u"xml文档内容: ",DOMTree.toxml()

    执行结果:

    hasAttribute(name):判断某个节点node是否存在某个属性,存在则返回True,否则返回False。

    #coding=utf-8

    #从xml.dom.minidom模块引入解析器parse

    from xml.dom.minidom import parse

    #minidom解析器打开xml文档并将其解析为内存中的一棵树

    DOMTree= parse(r"e:movie.xml")

    #获取XML文档对象,也就是数的根节点

    collection=DOMTree.documentElement 

    print u"DOM树的根对象:",collection

    if collection.hasAttribute("type"):

        #判断根节点collection是否存在type属性

        print u"collection元素存在type属性"

    else:

        print u"collection元素不存在type属性"

    执行结果

    E:>python py.txt

    DOM树的根对象: <DOM Element: collection at 0x2881f48>

    collection元素不存在type属性

             node.getAttribute(attname):获取节点node的某个属性的值

    #coding=utf-8

    #从xml.dom.minidom模块引入解析器parse

    from xml.dom.minidom import parse

    #minidom解析器打开xml文档并将其解析为内存中的一棵树

    DOMTree= parse(r"e:movie.xml")

    #获取XML文档对象,也就是数的根节点

    collection=DOMTree.documentElement 

    print u"DOM树的根对象:",collection

    if collection.hasAttribute("shelf"):

        print u"DOM树的根节点属性:",collection.getAttribute("shelf")

    """

    执行结果

    E:>python py.txt

    DOM树的根对象: <DOM Element: collection at 0x2781f48>

    DOM树的根节点属性: New Arrivals

    """

             node.getElementsByTagName(name):获取XML文档中某个父节点下具有相同节点名称的节点对象集合,是一个list对象。

    #coding=utf-8

    #从xml.dom.minidom模块引入解析器parse

    from xml.dom.minidom import parse

    #minidom解析器打开xml文档并将其解析为内存中的一棵树

    DOMTree= parse(r"e:movie.xml")

    #获取XML文档对象,也就是数的根节点

    collection=DOMTree.documentElement 

    print u"DOM树的根对象:",collection

    #获取根节点collection下所有movie节点的list集合

    movies=collection.getElementsByTagName("movie")

    print movies

    for i in movies:

        print i

    """

    执行结果

    E:>python py.txt

    DOM树的根对象: <DOM Element: collection at 0x2851f48>

    [<DOM Element: movie at 0x285f108>, <DOM Element: movie at 0x285f908>, <DOM Element: movie at 0x2868148>, <DOM Element: movie at 0x2868948>]

    <DOM Element: movie at 0x285f108>

    <DOM Element: movie at 0x285f908>

    <DOM Element: movie at 0x2868148>

    <DOM Element: movie at 0x2868948>

    """

          node.childNodes:返回节点node下所有子节点组成的list。

    #coding=utf-8

    #从xml.dom.minidom模块引入解析器parse

    from xml.dom.minidom import parse

    #minidom解析器打开xml文档并将其解析为内存中的一棵树

    DOMTree= parse(r"e:movie.xml")

    #获取XML文档对象,也就是数的根节点

    collection=DOMTree.documentElement 

    print u"DOM树的根对象:",collection

    #获取根节点collection下所有movie节点的list集合

    movies=collection.getElementsByTagName("movie")

    print movies[0].childNodes

    执行结果

    node.childNodes[index].data:获取节点node的文本值,即标签之间的内容。

    #coding=utf-8

    #从xml.dom.minidom模块引入解析器parse

    from xml.dom.minidom import parse

    #minidom解析器打开xml文档并将其解析为内存中的一棵树

    DOMTree= parse(r"e:movie.xml")

    #获取XML文档对象,也就是数的根节点

    collection=DOMTree.documentElement 

    print u"DOM树的根对象:",collection

    #获取根节点collection下所有movie节点的list集合

    Movies=collection.getElementsByTagName("movie")

    print u"共有%s部电影"%Movies.length

    #获取根节点collection下第一个movie节点下所有stars节点的list集合

    movies=Movies[0].getElementsByTagName("stars")

    print u"第一部电影有%s个stars参数"%movies.length

    print u"这个stars是:",movies[0].childNodes[0].data

    """

    执行结果

    E:>python py.txt

    DOM树的根对象: <DOM Element: collection at 0x2831f48>

    共有4部电影

    第一部电影有1个stars参数

    这个stars是: 10

    """

             node.haschildNodes():判断节点node下是否有叶子节点,如果有返回True,否则返回False;注意:每个节点都默认有一个文本叶子节点,所以只要标签后有值,就返回True,只有当标签后没有值并且也没有叶子节点时才会返回False。

    #coding=utf-8

    #从xml.dom.minidom模块引入解析器parse

    from xml.dom.minidom import parse

    #minidom解析器打开xml文档并将其解析为内存中的一棵树

    DOMTree= parse(r"e:movie.xml")

    #获取XML文档对象,也就是数的根节点

    collection=DOMTree.documentElement 

    print u"DOM树的根对象:",collection

    #获取根节点collection下所有movie节点的list集合

    Movies=collection.getElementsByTagName("movie")

    print u"共有%s部电影"%Movies.length

    #获取根节点collection下第一个movie节点下所有stars节点的list集合

    if Movies[0].hasChildNodes():

        print u"第一部电影存在叶子节点"

    else:

        print u"第一部电影不存在叶子节点"

    """

    执行结果

    E:>python py.txt

    DOM树的根对象: <DOM Element: collection at 0x2801f48>

    共有4部电影

    第一部电影存在叶子节点

    """

    3.3.2使用xml.dom解析xml的完整实例

    #coding=utf-8

    #从xml.dom.minidom模块引入解析器parse

    from xml.dom.minidom import parse

    import xml.dom.minidom

    #minidom解析器打开xml文档并将其解析为内存中的一棵树

    DOMTree= xml.dom.minidom.parse(r"e:movie.xml")

    print type(DOMTree)

    #获取XML文档的根节点

    collection=DOMTree.documentElement 

    #判断根节点中是否有"shelf"属性,如果有则获取并打印

    if collection.hasAttribute("shelf"):

        print "root element:%s"%collection.getAttribute("shelf")

    #获取所有电影getElementsByTagName()方法可返回带有指定标签名的对象的集合

    movies=collection.getElementsByTagName("movie")

    #print movies

    """

    [<DOM Element: movie at 0x28d2fc8>, <DOM Element: movie at 0x28df808>, <DOM Element: movie at 0x28e8048>, <DOM Element: movie at

    0x28e8848>]

    """

    #打印每部电影的详细信息

    for movie in movies:

        print "*****Movie*****"

        #获取并打印电影名称

        if movie.hasAttribute("title"):

            print "Title:%s"%movie.getAttribute("title")

        #获取并打印每部电影的其他属性childNodes以Nodelist对象的形式返回节点的子节点集合

        type = movie.getElementsByTagName('type')[0]

        print "Type: %s" % type.childNodes[0].data

        format = movie.getElementsByTagName('format')[0]

        print "Format: %s" % format.childNodes[0].data

        rating = movie.getElementsByTagName('rating')[0]

        print "Rating: %s" % rating.childNodes[0].data

        description = movie.getElementsByTagName('description')[0]

        print "Description: %s" % description.childNodes[0].data

        stars=movie.getElementsByTagName("stars")[0]

        print "stars:%s"%stars.childNodes[0].data

        if movie.getElementsByTagName("year"):

            print "year:%s"%movie.getElementsByTagName("year")[0].childNodes[0].data

    """

    执行结果

    E:>python py.txt

    <type 'instance'>

    root element:New Arrivals

    *****Movie*****

    Title:Enemy Behind

    Type: War, Thriller

    Format: DVD

    Rating: PG

    Description: Talk about a US-Japan war

    stars:10

    year:2003

    *****Movie*****

    Title:Transformers

    Type: Anime, Science Fiction

    Format: DVD

    Rating: R

    Description: A schientific fiction

    stars:8

    year:1989

    *****Movie*****

    Title:Trigun

    Type: Anime, Action

    Format: DVD

    Rating: PG

    Description: Vash the Stampede!

    stars:10

    *****Movie*****

    Title:Ishtar

    Type: Comedy

    Format: VHS

    Rating: PG

    Description: Viewable boredom

    stars:2

    """

    3.4:xml.dom创建XML文件

    创建xml文件的步骤如下:

    1、创建xml空文档

    2、产生根对象

    3、往根对象里加数据

    4、把xml内存对象写到文件

    3.4.1创建xml空白文档

    minidom.Document():此方法用于创建一个空白的xml文档对象,并返回这个doc对象。每个xml文档都是一个Document对象,代表着内存中的DOM树。

    >>> import xml.dom.minidom

    >>> doc=xml.dom.minidom.Document()

    >>> print doc

    <xml.dom.minidom.Document instance at 0x0000000002858D08>

    >>> 

    3.4.2创建xml文档根节点

    doc.createElement(tagName):生成xml文档节点。参数表示要生成节点的名称。

    >>> import xml.dom.minidom

    >>> doc=xml.dom.minidom.Document()

    >>> print doc

    <xml.dom.minidom.Document instance at 0x0000000002858D08>

    >>> root=doc.createElement("Managers")

    >>> print u"添加的xml标签为:",root.tagName

    添加的xml标签为: Managers

    3.4.3添加节点属性

    node.setAttribute(attname,value):此方法表示给节点添加属性值对。attname表示属性的名称,value表示属性的值

    >>> import xml.dom.minidom

    >>> doc=xml.dom.minidom.Document()

    >>> print doc

    <xml.dom.minidom.Document instance at 0x0000000002858D08>

    >>> root=doc.createElement("Managers")

    >>> print u"添加的xml标签为:",root.tagName

    添加的xml标签为: Managers

    >>> root.setAttribute("company","XX技术")

    >>> value=root.getAttribute("company")

    >>> print u"root元素的'company'属性值为:",value

    root元素的'company'属性值为: XX技术

    3.4.4添加文本节点

    doc.createTextNode(data):给叶子节点添加文本节点。

    >>> import xml.dom.minidom

    >>> doc=xml.dom.minidom.Document()

    >>> print doc

    <xml.dom.minidom.Document instance at 0x0000000002858D08>

    >>> root=doc.createElement("Managers")

    >>> print u"添加的xml标签为:",root.tagName

    添加的xml标签为: Managers

    >>> root.setAttribute("company","XX技术")

    >>> value=root.getAttribute("company")

    >>> print u"root元素的'company'属性值为:",value

    root元素的'company'属性值为: XX技术

    >>> ceo=doc.createElement("CEO")

    >>> ceo.appendChild(doc.createTextNode("pang"))

    <DOM Text node "'pang'">

    >>> print ceo.tagName

    CEO

    >>> 

    3.4.5添加子节点

    doc/parentNode.appendChild(node):将节点node添加到文档对象doc作为文档树的根节点或者添加到父节点parentNode下作为其子节点。

    #coding=utf-8

    import xml.dom.minidom

    #在内存中创建一个空的xml文档 Document对象

    doc=xml.dom.minidom.Document()

    #创建一个根节点school对象

    root=doc.createElement("school")

    #给根节点添加属性

    root.setAttribute("name",u"学校信息")

    #将根节点添加到文档对象中

    doc.appendChild(root)

    #给根节点添加一个叶子结点

    school=doc.createElement(u"class")

    #叶子节点下在嵌套叶子节点,并给节点添加文本节点

    name=doc.createElement("schoolName")

    name.appendChild(doc.createTextNode(u"北京大学附属中学"))

    #将子节点name添加到根节点school中

    school.appendChild(name)

    teacher=doc.createElement("Teacher")

    teacher.appendChild(doc.createTextNode(u"张三"))

    school.appendChild(teacher)

    #将school节点添加到父节点root中

    root.appendChild(school)

    #打印xml内容

    print doc.toxml()

    执行结果

    E:>python py.txt

    <?xml version="1.0" ?><school name="学校信息"><class><schoolName>北京大学附属中

    学</schoolName><Teacher>张三</Teacher></class></school>

    3.4.6生成XML文档

    doc.writexml():函数原型writexml(write,indent=””,addindent=””,newl=””,encoding=None).此方法用于将内存中的xml文档树写入文件中,并保存到本地磁盘。

    write:要写的目标文件的文件对象

    indent:指明根节点缩进方式。

    addindent:指明子节点的缩进方式

    newl:针对新行,指明换行方式

    enconding:指明所写xml文档的编码

    #coding=utf-8

    import xml.dom.minidom

    import codecs

    #在内存中创建一个空的xml文档 Document对象

    doc=xml.dom.minidom.Document()

    #创建一个根节点school对象

    root=doc.createElement("school")

    #给根节点添加属性

    root.setAttribute("name",u"北京大学附属中学")

    #将根节点添加到文档对象中

    doc.appendChild(root)

    #给根节点添加一个叶子结点

    school=doc.createElement(u"class")

    #叶子节点下在嵌套叶子节点,并给节点添加文本节点

    name=doc.createElement("className")

    name.appendChild(doc.createTextNode(u"三五班"))

    #将子节点name添加到根节点school中

    school.appendChild(name)

    teacher=doc.createElement("Teacher")

    teacher.appendChild(doc.createTextNode(u"张三"))

    school.appendChild(teacher)

    #将school节点添加到父节点root中

    root.appendChild(school)

    #写入文件

    fp=codecs.open("e:\school.xml","w","utf-8")

    doc.writexml(fp,indent="",addindent=" ",newl=" ",encoding="utf-8")

    fp.close()

  • 相关阅读:
    打印一个0到1之间的数的二进制表示
    bzoj-3223 文艺平衡树
    Linux下使用fstatfs/statfs查询系统相关信息
    Pku3664
    hdu-2544 最短路
    java同步包种ArrayBlockingQueue类的分析与理解
    【剑指offer】不用加减乘除做加法
    PA模块经常使用表
    网络编程
    // 插入排序 源代码
  • 原文地址:https://www.cnblogs.com/pw20180101/p/8932404.html
Copyright © 2011-2022 走看看