繁体   English   中英

使用lxml解析xml时出现异常

[英]Exception when parsing a xml using lxml

我写了这段代码来通过xsd验证我的xml文件

def parseAndObjectifyXml(xmlPath, xsdPath):
    from lxml import  etree

    xsdFile = open(xsdPath)
    schema = etree.XMLSchema(file=xsdFile)
    xmlinput = open(xmlPath)
    xmlContent = xmlinput.read()
    myxml = etree.parse(xmlinput) # In this line xml input is empty
    schema.assertValid(myxml)

但是当我想验证它时,我的xmlinput是空的但我的xmlContent不是空的。 问题是什么?

python中的文件有一个“当前位置”; 它从文件的开头(位置0)开始,然后,当您读取文件时,当前位置指针一直移动直到它到达结尾。

在lxml解析器可以完整读取内容之前,您需要将该指针放回到开头。 使用.seek()方法

from lxml import  etree

def parseAndObjectifyXml(xmlPath, xsdPath):
    xsdFile = open(xsdPath)
    schema = etree.XMLSchema(file=xsdFile)
    xmlinput = open(xmlPath)
    xmlContent = xmlinput.read()
    xmlinput.seek(0)
    myxml = etree.parse(xmlinput)
    schema.assertValid(myxml)

如果你xmlContent其他地方也需要xmlContent你只需xmlContent ; 如果包装在StringIO对象中以提供必要的文件对象方法,您也可以将其传递给.parse()方法:

from lxml import  etree
from cStringIO import StringIO

def parseAndObjectifyXml(xmlPath, xsdPath):
    xsdFile = open(xsdPath)
    schema = etree.XMLSchema(file=xsdFile)
    xmlinput = open(xmlPath)
    xmlContent = xmlinput.read()
    myxml = etree.parse(StringIO(xmlContent))
    schema.assertValid(myxml)

如果你没有使用xmlContent做任何其他事情,那么你也不需要额外的.read()调用,随后也不会.read() lxml解析它的问题; 只是省略了调用,你不需要将当前位置指针移回到开头:

from lxml import  etree

def parseAndObjectifyXml(xmlPath, xsdPath):
    xsdFile = open(xsdPath)
    schema = etree.XMLSchema(file=xsdFile)
    xmlinput = open(xmlPath)
    myxml = etree.parse(xmlinput)
    schema.assertValid(myxml)

要了解有关.seek() (以及它的副本, .tell() )的更多信息,请阅读Python教程中的文件对象

您应该使用您已阅读的XML内容:

xmlContent = xmlinput.read()
myxml = etree.parse(xmlContent)

代替:

myxml = etree.parse(xmlinput)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM