Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 解析XML文件并根据xsd模式进行验证_Python_Xml_Xsd_Xmlschema - Fatal编程技术网

Python 解析XML文件并根据xsd模式进行验证

Python 解析XML文件并根据xsd模式进行验证,python,xml,xsd,xmlschema,Python,Xml,Xsd,Xmlschema,这是我需要根据模式xsd文件解析和验证的XML输出示例 某个名字 5908390481 某个地址 某个名字 s1036456 12 某个地址 800 100 50 10 某个名字 s1036789 15 某个地址 1000 200 50 10 此文件本身不是有效的XML,因为没有单个标记包装所有其他标记。但是每个记录(即SCHOOL和STUDENTEXP)都是有效的XML,并且它根据模式(SCHOOL.xsd、STUDENTEXP.xsd)进行验证 我从来没有使用过这种格式,也不确定一些事情

这是我需要根据模式xsd文件解析和验证的XML输出示例


某个名字
5908390481
某个地址
某个名字
s1036456
12
某个地址
800
100
50
10
某个名字
s1036789
15
某个地址
1000
200
50
10
此文件本身不是有效的XML,因为没有单个标记包装所有其他标记。但是每个记录(即SCHOOL和STUDENTEXP)都是有效的XML,并且它根据模式(SCHOOL.xsd、STUDENTEXP.xsd)进行验证

我从来没有使用过这种格式,也不确定一些事情,比如如何以编程方式解析这样的文件? 通常使用lxml,我们可以验证每个记录是否位于单独的文件中:

xmlschema=etree.xmlschema(etree.parse('./studentexp.xsd'))
assertValidate(etree.parse('./sampleStudentexp.xml'))

提取“记录”并分别验证它们的正确方法是什么

以前有人问过这个问题:


我怀疑有一种单通道解决方案涉及到使用流解析器。我的Python不够强大,无法判断它是否可行。无论如何-该线程中的一个解决方案可能已经足够好了。

lxml具有基于标记的事件解析。 下面的方法奏效了

parser = etree.XMLPullParser(events=('start', 'end'))
events = parser.read_events()

with open('.\sample.xml', 'rb') as f:
    d1 = deque()
    for line in f:
        parser.feed(line)
        for action, e in events:
            if action == 'start':
                d1.append(e.tag)
            elif action == 'end' and len(d1) == 1:
                if d1.pop() == e.tag:
                    root = parser.close()
                    print(etree.tostring(root, pretty_print=True, encoding="UTF-8").decode("UTF-8"))
            else:
                d1.pop()