xml.parsers.expat (Structured Markup) – Python 中文开发手册

作者: Arvin Chen 分类: python 来源: Break易站(www.breakyizhan.com)
  •   Python 中文开发手册

    xml.parsers.expat (Structured Markup) - Python 中文开发手册

    警告

    该pyexpat模块对恶意构建的数据不安全。如果您需要解析不可信或未经身份验证的数据,请参阅XML漏洞。

    2.0版本中的新功能。

    xml.parsers.expat模块是Expat非验证XML解析器的Python接口。 该模块提供了一种扩展类型xmlparser,它表示XML解析器的当前状态。 在创建xmlparser对象后,可以将对象的各种属性设置为处理函数。 然后,当XML文档被提供给解析器时,处理函数被调用用于XML文档中的字符数据和标记。

    该模块使用该pyexpat模块提供对Expat解析器的访问。直接使用pyexpat模块已被弃用。

    该模块提供一个例外和一个类型对象:

    exception xml.parsers.expat.ExpatError

    当Expat报告错误时引发异常。有关解释Expat错误的更多信息,请参见ExpatError异常一节。

    exception xml.parsers.expat.error

    ExpatError别名。

    xml.parsers.expat.XMLParserType

    ParserCreate()函数返回值的类型。

    该xml.parsers.expat模块包含两个功能:

    xml.parsers.expat.ErrorString(errno)

    返回给定错误号errno 的说明性字符串。

    xml.parsers.expat.ParserCreate([encoding[, namespace_separator]])

    创建并返回一个新的xmlparser对象。 编码(如果指定)必须是一个字符串,用于命名XML数据使用的编码。 Expat不支持Python那样多的编码,编码的编码不能扩展; 它支持UTF-8,UTF-16,ISO-8859-1(Latin1)和ASCII。 如果给出编码[1],它将覆盖文档的隐式或显式编码。

    Expat可以选择为您执行XML名称空间处理,通过为namespace_separator提供值来启用它。 该值必须是一个字符的字符串; 如果字符串的长度非法,则会引发ValueError(无与None相同)。 当启用名称空间处理时,属于名称空间的元素类型名称和属性名称将被展开。 传递给元素处理程序StartElementHandler和EndElementHandler的元素名称将是名称空间URI,名称空间分隔符和名称的本地部分的串联。 如果名称空间分隔符是零字节(chr(0)),则命名空间URI和本地部分将被连接而没有任何分隔符。

    例如,如果namespace_separator被设置为空格字符(' ')并且解析了以下文档:

    <?xml version="1.0"?>
    <root xmlns    = "http://default-namespace.org/"
          xmlns:py = "http://www.python.org/ns/">
      <py:elem1 />
      <elem2 xmlns="" />
    </root>

    StartElementHandler 将为每个元素接收以下字符串:

    http://default-namespace.org/ root
    http://www.python.org/ns/ elem1
    elem2

    由于pyexpat使用的Expat库的限制,返回的xmlparser实例只能用于解析单个XML文档。 为每个文档调用ParserCreate以提供唯一的解析器实例。

    扩展内容

    Expat项目的Expat XML Parser主页。

    1. XMLParser对象

    xmlparser 对象有以下方法:

    xmlparser.Parse(data[, isfinal])

    分析字符串数据 的内容,调用适当的处理函数来处理解析的数据。isfinal必须对这种方法最后调用真实的; 它允许解析片段中的单个文件,而不是提交多个文件。数据 可以是任何时候的空字符串。

    xmlparser.ParseFile(file)

    从目标文件中解析XML数据读取。文件只需要提供read(nbytes)方法,当没有更多数据时返回空字符串。

    xmlparser.SetBase(base)

    设置声明中用于解析系统标识符中的相对URI的基数。解析相关标识符被留给应用:此值将通过作为传递基础参数的ExternalEntityRefHandler(),NotationDeclHandler()和UnparsedEntityDeclHandler()功能。

    xmlparser.GetBase()

    返回包含基本由先前的呼叫建立一个字符串SetBase(),或者None如果SetBase()没有被调用。

    xmlparser.GetInputContext()

    以字符串形式返回生成当前事件的输入数据。数据在包含文本的实体的编码中。在事件处理程序未处于活动状态时调用时,返回值为None。

    2.1版本中的新功能。

    xmlparser.ExternalEntityParserCreate(context[, encoding])

    创建一个“子”解析器,它可以用来解析由父解析器解析的内容引用的外部解析实体。 context参数应该是传递给ExternalEntityRefHandler()处理函数的字符串,如下所述。 子解析器是使用ordered_attributes,returns_unicode和specified_attributes设置为此解析器的值创建的。

    xmlparser.SetParamEntityParsing(flag)

    控制参数实体的解析(包括外部DTD子集)。可能的标志值是XML_PARAM_ENTITY_PARSING_NEVER,XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE与XML_PARAM_ENTITY_PARSING_ALWAYS。如果设置标志成功,则返回true。

    xmlparser.UseForeignDTD([flag])

    使用flag的真实值(默认值)调用此函数将导致Expat 为所有参数调用ExternalEntityRefHandler带 None以允许加载备用DTD。如果文档不包含文档类型声明中,ExternalEntityRefHandler仍然会被调用,但StartDoctypeDeclHandler与EndDoctypeDeclHandler不会被调用。

    为 flag 传递一个错误的值将取消之前通过一个真值的调用,但是否则不起作用。

    此方法只能在调用Parse()或ParseFile()方法之前调用; 在调用其中任何一个被调用的原因后ExpatError,将其code设置为的属性进行调用errors.XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING。

    2.3版本的新功能。

    xmlparser 对象具有以下属性:

    xmlparser.buffer_size

    所用缓冲区的大小buffer_text为true时。通过为该属性分配新的整数值可以设置新的缓冲区大小。当大小改变时,缓冲区将被刷新。

    2.3版本的新功能。

    在版本2.6中更改:现在可以更改缓冲区大小。

    xmlparser.buffer_text

    将其设置为true将导致xmlparser对象缓冲由Expat返回的文本内容,以避免多次调用CharacterDataHandler()回调函数。 这可以大大提高性能,因为Expat通常会在每行结尾处将字符数据分块为块。 此属性默认为false,可随时更改。

    2.3版本的新功能。

    xmlparser.buffer_used

    如果buffer_text启用,则存储在缓冲区中的字节数。这些字节表示UTF-8编码的文本。错误时该属性没有有意义的解释buffer_text。

    2.3版本的新功能。

    xmlparser.ordered_attributes

    将此属性设置为非零整数会导致将属性报告为列表而不是字典。属性以文档文本中的顺序显示。对于每个属性,都会显示两个列表条目:属性名称和属性值。(此模块的旧版本也使用此格式。)默认情况下,此属性为false; 它可能会随时更改。

    2.1版本中的新功能。

    xmlparser.returns_unicode

    如果此属性设置为非零整数,则处理函数将传递Unicode字符串。 如果returns_unicode为False,则包含UTF-8编码数据的8位字符串将传递给处理程序。 当Python使用Unicode支持构建时,默认情况下为True。

    在版本1.6中更改:可随时更改以影响结果类型。

    xmlparser.specified_attributes

    如果设置为非零整数,解析器将只报告在文档实例中指定的那些属性,而不报告从属性声明派生的属性。设置此应用程序时,需要特别小心地根据需要使用声明中提供的附加信息,以符合XML处理器行为标准。默认情况下,此属性为false; 它可能会随时更改。

    2.1版本中的新功能。

    以下属性包含与xmlparser对象遇到的最近错误相关的值,并且一旦对Parse()或ParseFile()的调用引发了xml.parsers.expat.ExpatError异常,它将只具有正确的值。

    xmlparser.ErrorByteIndex

    发生错误的字节索引。

    xmlparser.ErrorCode

    指定问题的数字代码。 该值可以传递给ErrorString()函数,或者与错误对象中定义的常量之一进行比较。

    xmlparser.ErrorColumnNumber

    发生错误的列号。

    xmlparser.ErrorLineNumber

    发生错误的行号。

    以下属性包含与xmlparser对象中当前分析位置相关的值。 在回调报告解析事件期间,它们指示生成事件的第一个字符序列的位置。 当在回调之外调用时,指示的位置将刚过最后的分析事件(不管是否存在关联的回调)。

    2.4版本中的新功能。

    xmlparser.CurrentByteIndex

    解析器输入中的当前字节索引。

    xmlparser.CurrentColumnNumber

    解析器输入中的当前列号。

    xmlparser.CurrentLineNumber

    解析器输入中的当前行号。

    这是可以设置的处理程序列表。 要在xmlparser对象o上设置处理程序,请使用o.handlername = func。 handlername必须从下面的列表中获取,func必须是一个可接受的对象,接受正确数量的参数。 参数都是字符串,除非另有说明。

    xmlparser.XmlDeclHandler(version, encoding, standalone)

    在分析XML声明时调用。 XML声明是XML建议的适用版本的声明(可选),文档文本的编码以及可选的“独立”声明。 版本和编码将是由returns_unicode属性指定的类型的字符串,如果文档被声明为独立版本,则独立版本将为1,如果声明不独立版本,则独立版本将为1;如果独立条款被省略,则为-1。 这只适用于Expat版本1.95.0或更新的版本。

    2.1版本中的新功能。

    xmlparser.StartDoctypeDeclHandler(doctypeName, systemId, publicId, has_internal_subset)

    当Expat开始解析文档类型声明(<!DOCTYPE ...)时调用。 doctypeName与提供的完全一致。 如果指定了systemId和publicId参数,则会提供系统和公共标识符,如果省略,则为None。 如果文档包含内部文档声明子集,has_internal_subset将为true。 这需要Expat版本1.2或更新版本。

    xmlparser.EndDoctypeDeclHandler()

    在Expat完成时解析文档类型声明时调用。这需要Expat版本1.2或更新版本。

    xmlparser.ElementDeclHandler(name, model)

    为每个元素类型声明调用一次。name是元素类型的名称,model是内容模型的表示。

    xmlparser.AttlistDeclHandler(elname, attname, type, default, required)

    针对元素类型的每个声明的属性进行调用。 如果一个属性列表声明声明了三个属性,那么这个处理器将被调用三次,每个属性一次。 elname是声明适用的元素的名称,attname是声明的属性的名称。 属性类型是作为类型传递的字符串; 可能的值是'CDATA','ID','IDREF',... default给出了文档实例未指定属性时使用的属性的默认值,如果没有默认值,则默认值为None(#IMPLIED值)。 如果需要在文档实例中提供该属性,则必填项为true。 这需要Expat版本1.95.0或更新版本。

    xmlparser.StartElementHandler(name, attributes)

    调用每个元素的开始。name是包含元素名称的字符串,属性是将属性名称映射到其值的字典。

    xmlparser.EndElementHandler(name)

    调用每个元素的结尾。

    xmlparser.ProcessingInstructionHandler(target, data)

    为每个处理指令调用。

    xmlparser.CharacterDataHandler(data)

    调用字符数据。 这将被称为正常字符数据,CDATA标记的内容和可忽略的空白。 必须区分这些情况的应用程序可以使用StartCdataSectionHandler,EndCdataSectionHandler和ElementDeclHandler回调来收集所需的信息。

    xmlparser.UnparsedEntityDeclHandler(entityName, base, systemId, publicId, notationName)

    调用未解析的(NDATA)实体声明。这只适用于Expat库的1.2版本; 对于更新的版本,请改用EntityDeclHandler。(Expat库中的基本功能已被宣告已过时。)

    xmlparser.EntityDeclHandler(entityName, is_parameter_entity, value, base, systemId, publicId, notationName)

    请求所有实体声明。 对于参数和内部实体,值将是一个给出实体声明内容的字符串; 对于外部实体这将是None。 对于解析实体,notationName参数将为None,未解析实体的符号名称为。 如果实体是参数实体,则is_parameter_entity将为true;对于一般实体,is_parameter_entity将为true(大多数应用程序只需要关注一般实体)。 这仅适用于Expat库的版本1.95.0。

    2.1版本中的新功能。

    xmlparser.NotationDeclHandler(notationName, base, systemId, publicId)

    请求标记声明。 notationName,base和systemId以及publicId是字符串(如果有的话)。 如果省略公共标识符,则publicId将为None。

    xmlparser.StartNamespaceDeclHandler(prefix, uri)

    当元素包含名称空间声明时调用。在StartElementHandler调用放置声明的元素之前处理名称空间声明。

    xmlparser.EndNamespaceDeclHandler(prefix)

    当包含名称空间声明的元素到达结束标记时调用。对于元素中的每个名称空间声明,调用该名称空间声明时会调用该名称空间声明,StartNamespaceDeclHandler以指示每个名称空间声明范围的开始。调用这个处理函数是EndElementHandler在元素结束的相应位置之后进行的。

    xmlparser.CommentHandler(data)

    调用comments。数据 是评论的文本,不包括前导'<!--'和尾随'-->'。

    xmlparser.StartCdataSectionHandler()

    在CDATA部分开始时调用。这和EndCdataSectionHandler需要能够识别CDATA部分的语法开始和结束。

    xmlparser.EndCdataSectionHandler()

    在CDATA部分结束时调用。

    xmlparser.DefaultHandler(data)

    调用XML文档中没有指定适用处理程序的任何字符。这意味着字符是可以被报告的构造的一部分,但是没有提供处理程序。

    xmlparser.DefaultHandlerExpand(data)

    这DefaultHandler()与内部实体的扩展一样,但并不妨碍扩展。实体引用不会传递给默认处理程序。

    xmlparser.NotStandaloneHandler()

    如果XML文档没有被声明为独立文档,则调用它。 这发生在存在外部子集或对参数实体的引用时,但XML声明在XML声明中没有将独立设置为yes。 如果此处理程序返回0,那么解析器将引发一个XML_ERROR_NOT_STANDALONE错误。 如果未设置此处理程序,解析器不会为此情况引发异常。

    xmlparser.ExternalEntityRefHandler(context, base, systemId, publicId)

    请求参考外部实体。 base是当前的基础,由以前对SetBase()的调用设置。 公共和系统标识符systemId和publicId是字符串,如果有的话; 如果未提供公共标识符,则publicId将为None。 上下文值是不透明的,只能按照下面的描述使用。

    对于要分析的外部实体,必须实现此处理程序。 它负责使用ExternalEntityParserCreate(context)创建子分析器,使用适当的回调对其进行初始化并解析实体。 该处理程序应返回一个整数; 如果它返回0,解析器将引发一个XML_ERROR_EXTERNAL_ENTITY_HANDLING错误,否则解析将继续。

    如果未提供此处理程序,则通过DefaultHandler回调报告外部实体(如果提供)。

    2. ExpatError异常

    ExpatError 例外有许多有趣的属性:

    ExpatError.code

    Expat的特定错误的内部错误编号。这将匹配errors来自该模块的对象中定义的常量之一。

    2.1版本中的新功能。

    ExpatError.lineno

    检测到错误的行号。第一行编号1。

    2.1版本中的新功能。

    ExpatError.offset

    将字符偏移到发生错误的行中。第一列是编号0。

    2.1版本中的新功能。

    3.例子

    下面的程序定义了三个处理程序,只是打印出他们的参数。

    import xml.parsers.expat
    
    # 3 handler functions
    def start_element(name, attrs):
        print 'Start element:', name, attrs
    def end_element(name):
        print 'End element:', name
    def char_data(data):
        print 'Character data:', repr(data)
    
    p = xml.parsers.expat.ParserCreate()
    
    p.StartElementHandler = start_element
    p.EndElementHandler = end_element
    p.CharacterDataHandler = char_data
    
    p.Parse("""<?xml version="1.0"?>
    <parent id="top"><child1 name="paul">Text goes here</child1>
    <child2 name="fred">More text</child2>
    </parent>""", 1)

    这个程序的输出是:

    Start element: parent {'id': 'top'}
    Start element: child1 {'name': 'paul'}
    Character data: 'Text goes here'
    End element: child1
    Character data: '\n'
    Start element: child2 {'name': 'fred'}
    Character data: 'More text'
    End element: child2
    Character data: '\n'
    End element: parent

    4.内容模型描述

    内容模型使用嵌套元组进行描述。每个元组包含四个值:类型,量词,名称和子节点的元组。子节点仅仅是附加的内容模型描述。

    前两个字段的值是在xml.parsers.expat模块的模型对象中定义的常量。 这些常量可以分为两组:模型类型组和量词组。

    模型类型组中的常量是:

    xml.parsers.expat.XML_CTYPE_ANY

    由模型名称命名的元素被声明为具有内容模型ANY。

    xml.parsers.expat.XML_CTYPE_CHOICE

    指定的元素允许从多个选项中进行选择; 这用于内容模型,如(A | B | C)。

    xml.parsers.expat.XML_CTYPE_EMPTY

    声明为EMPTY具有此模型类型的元素。

    xml.parsers.expat.XML_CTYPE_MIXEDxml.parsers.expat.XML_CTYPE_NAMExml.parsers.expat.XML_CTYPE_SEQ

    代表一系列相继模型的模型用这种模型类型表示。 这用于(A,B,C)等模型。

    量词组中的常量是:

    xml.parsers.expat.XML_CQUANT_NONE

    没有给出修饰符,所以它可以恰好出现一次,就像A.

    xml.parsers.expat.XML_CQUANT_OPT

    该模型是可选的:它可以出现一次或根本不出现,就像A?一样。

    xml.parsers.expat.XML_CQUANT_PLUS

    模型必须发生一次或多次(如A+)。

    xml.parsers.expat.XML_CQUANT_REP

    该模型必须出现零次或多次,如A*。

    5. Expat错误常量

    以下常量在xml.parsers.expat模块的错误对象中提供。 这些常量在解释发生错误时引发的ExpatError异常对象的某些属性时非常有用。

    该errors对象具有以下属性:

    xml.parsers.expat.XML_ERROR_ASYNC_ENTITYxml.parsers.expat.XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF

    属性值中的实体引用引用外部实体而不是内部实体。

    xml.parsers.expat.XML_ERROR_BAD_CHAR_REF

    字符引用涉及XML中非法的字符(例如字符0或' �')。

    xml.parsers.expat.XML_ERROR_BINARY_ENTITY_REF

    一个实体引用指的是一个用符号声明的实体,所以不能被解析。

    xml.parsers.expat.XML_ERROR_DUPLICATE_ATTRIBUTE

    一个属性在开始标记中多次使用。

    xml.parsers.expat.XML_ERROR_INCORRECT_ENCODINGxml.parsers.expat.XML_ERROR_INVALID_TOKEN

    当输入字节无法正确分配给字符时引发; 例如,UTF-8输入流中的NUL字节(值为0)。

    xml.parsers.expat.XML_ERROR_JUNK_AFTER_DOC_ELEMENT

    在文档元素之后发生了除空白外的其他内容。

    xml.parsers.expat.XML_ERROR_MISPLACED_XML_PI

    XML声明被发现在输入数据的开始之外的某处。

    xml.parsers.expat.XML_ERROR_NO_ELEMENTS

    该文档不包含任何元素(XML要求所有文档只包含一个顶层元素)..

    xml.parsers.expat.XML_ERROR_NO_MEMORY

    Expat无法在内部分配内存。

    xml.parsers.expat.XML_ERROR_PARAM_ENTITY_REF

    找不到参数实体引用。

    xml.parsers.expat.XML_ERROR_PARTIAL_CHAR

    在输入中找到了不完整的字符。

    xml.parsers.expat.XML_ERROR_RECURSIVE_ENTITY_REF

    实体参考包含对同一实体的另一个参考; 可能通过不同的名称,并可能间接。

    xml.parsers.expat.XML_ERROR_SYNTAX

    遇到了一些未指定的语法错误。

    xml.parsers.expat.XML_ERROR_TAG_MISMATCH

    结束标记与最内层的开始标记不匹配。

    xml.parsers.expat.XML_ERROR_UNCLOSED_TOKEN

    某些标记(例如开始标记)在流结束或遇到下一个标记之前未关闭。

    xml.parsers.expat.XML_ERROR_UNDEFINED_ENTITY

    有人提到一个没有定义的实体。

    xml.parsers.expat.XML_ERROR_UNKNOWN_ENCODING

    Expat不支持文档编码。

    xml.parsers.expat.XML_ERROR_UNCLOSED_CDATA_SECTION

    CDATA标记部分未关闭。

    xml.parsers.expat.XML_ERROR_EXTERNAL_ENTITY_HANDLINGxml.parsers.expat.XML_ERROR_NOT_STANDALONE

    解析器确定文档不是“独立的”,虽然它声明自己在XML声明中,并且NotStandaloneHandler已经设置并返回0。

    xml.parsers.expat.XML_ERROR_UNEXPECTED_STATExml.parsers.expat.XML_ERROR_ENTITY_DECLARED_IN_PExml.parsers.expat.XML_ERROR_FEATURE_REQUIRES_XML_DTD

    请求的操作需要编译DTD支持,但是Expat已配置为不支持DTD。这不应该由xml.parsers.expat模块的标准构建报告。

    xml.parsers.expat.XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING

    解析开始后,请求行为更改,只能在分析开始之前对其进行更改。这是(目前)只能通过UseForeignDTD()。

    xml.parsers.expat.XML_ERROR_UNBOUND_PREFIX

    在启用名称空间处理时找到未声明的前缀。

    xml.parsers.expat.XML_ERROR_UNDECLARING_PREFIX

    该文档试图删除与前缀关联的名称空间声明。

    xml.parsers.expat.XML_ERROR_INCOMPLETE_PE

    一个参数实体包含不完整的标记。

    xml.parsers.expat.XML_ERROR_XML_DECL

    该文件完全没有文件元素。

    xml.parsers.expat.XML_ERROR_TEXT_DECL

    解析外部实体中的文本声明时出错。

    xml.parsers.expat.XML_ERROR_PUBLICID

    在公共ID中发现不允许的字符。

    xml.parsers.expat.XML_ERROR_SUSPENDED

    请求的操作是在暂停的解析器上进行的,但不允许。这包括尝试提供额外的输入或停止解析器。

    xml.parsers.expat.XML_ERROR_NOT_SUSPENDED

    解析器未被暂停时尝试恢复解析器。

    xml.parsers.expat.XML_ERROR_ABORTED

    这不应该报告给Python应用程序。

    xml.parsers.expat.XML_ERROR_FINISHED

    请求的操作是在解析输入完成的解析器上完成的,但是不允许。这包括尝试提供额外的输入或停止解析器。

    xml.parsers.expat.XML_ERROR_SUSPEND_PE

    脚注

    1

    XML输出中包含的编码字符串应符合相应的标准。例如,“UTF-8”是有效的,但“UTF8”不是。请参阅https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl和https://www.iana.org/assignments/character-sets/character-sets.xhtml。

  •   Python 中文开发手册
  •   本文标题:xml.parsers.expat (Structured Markup) – Python 中文开发手册 - Break易站
    转载请保留页面地址:https://www.breakyizhan.com/python/35373.html
      微信返利机器人
      免费:淘宝,京东,拼多多优惠券
      腾讯,爱奇艺,优酷的VIP视频免费解析,免费看
      即刻扫描二维码,添加微信机器人!

    发表笔记

    电子邮件地址不会被公开。 必填项已用*标注