import sys
import StringIO
import lxml from lxml import etree
from StringIO import StringIO # Construct XML relevant to the XML schema we're validating against. By altering the string, adding/removing elements
# we can force different errors to occur when validating.
xml = StringIO('''
<CompanyDataRequest xmlns="http://xmlgw.companieshouse.gov.uk" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlgw.companieshouse.gov.uk http://xmlgw.companieshouse.gov.uk/v2-1/schema/CompanyData-v2-2.xsd">
<CompanyNumber>06937730</CompanyNumber>
<CompanyAuthenticationCode>123456</CompanyAuthenticationCode>
<MadeUpDate>2010-06-30x</MadeUpDate>
</CompanyDataRequest>
''') # Clear any previous errors
lxml.etree.clear_error_log() try:
# Get the XML schema to validate against
schema = lxml.etree.XMLSchema(file = 'http://xmlgw.companieshouse.gov.uk/v2-1/schema/CompanyData-v2-2.xsd')
# Parse string of XML
xml_doc = lxml.etree.parse(xml)
# Validate parsed XML against schema returning a readable message on failure
schema.assertValid(xml_doc)
# Validate parsed XML against schema returning boolean value indicating success/failure
print 'schema.validate() returns "%s".' % schema.validate(xml_doc) except lxml.etree.XMLSchemaParseError, xspe:
# Something wrong with the schema (getting from URL/parsing)
print "XMLSchemaParseError occurred!"
print xspe except lxml.etree.XMLSyntaxError, xse:
# XML not well formed
print "XMLSyntaxError occurred!"
print xse except lxml.etree.DocumentInvalid, di:
# XML failed to validate against schema
print "DocumentInvalid occurred!" error = schema.error_log.last_error
if error:
# All the error properties (from libxml2) describing what went wrong
print 'domain_name: ' + error.domain_name
print 'domain: ' + str(error.domain)
print 'filename: ' + error.filename # '<string>' cos var is a string of xml
print 'level: ' + str(error.level)
print 'level_name: ' + error.level_name # an integer
print 'line: ' + str(error.line) # a unicode string that identifies the line where the error occurred.
print 'message: ' + error.message # a unicode string that lists the message.
print 'type: ' + str(error.type) # an integer
print 'type_name: ' + error.type_name

封装类

 #!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:Eric.yue import os
import lxml.etree as ET
from StringIO import StringIO
import chardet class R3xmlCheck(object):
def __init__(self, element_xml):
self.elem_xml = element_xml def validate_xsd_xml(self, f_xml, elem_xsd):
try:
elem_xsd = elem_xsd.encode('utf-8')
xsd_doc = StringIO(elem_xsd)
xml_doc = StringIO(f_xml)
xmlschema_doc = ET.parse(xsd_doc)
xmlschema = ET.XMLSchema(xmlschema_doc)
xml = ET.parse(xml_doc)
xmlschema.assertValid(xml)
print 'schema.validate() returns "%s".' % xmlschema.validate(xml) except ET.XMLSchemaParseError, xspe:
# Something wrong with the schema (getting from URL/parsing)
print "XMLSchemaParseError occurred!"
print xspe except ET.XMLSyntaxError, xse:
# XML not well formed
print "XMLSyntaxError occurred!"
print xse except ET.DocumentInvalid, di:
# XML failed to validate against schema
print "DocumentInvalid occurred!" error = xmlschema.error_log.last_error
if error:
# All the error properties (from libxml2) describing what went wrong
print 'domain_name: ' + error.domain_name
print 'domain: ' + str(error.domain)
print 'filename: ' + error.filename # '<string>' cos var is a string of xml
print 'level: ' + str(error.level)
print 'level_name: ' + error.level_name # an integer
print 'line: ' + str(error.line) # a unicode string that identifies the line where the error occurred.
print 'message: ' + error.message # a unicode string that lists the message.
print 'type: ' + str(error.type) # an integer
print 'type_name: ' + error.type_name def run(self):
res = self.validate_xml(self.elem_xml)
if res["result"] is not True:
return res["info"] elem_xsd = self.get_xsd() with open(self.elem_xml) as f:
f_xml = f.read()
chardet_info = chardet.detect(f_xml)
if chardet_info['encoding'] == 'ascii':
f_xml = f_xml.encode('utf-8')
self.validate_xsd_xml(f_xml.strip(),elem_xsd) # matching schemaLocation url
def get_xsd(self):
with open("./xsd/multicacheschemas/MCCI_IN200100UV01.xsd") as f:
elem_xsd = f.read()
return elem_xsd def validate_xml(self, exml):
rinfo = {}
if os.path.exists(exml):
try:
ET.parse(exml)
rinfo['result'] = True
except Exception as err:
rinfo['result'] = False
rinfo['info'] = 'Parsing error info:{0}'.format(err)
return rinfo if __name__ == "__main__":
aa = R3xmlCheck("./xsd/aa.xml")
aa.run()

通过xsd schema结构来验证xml是否合法的更多相关文章

  1. XSD(XML Schema Definition)用法实例介绍以及C#使用xsd文件验证XML格式

    XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD),作用是定义 XML 文档的合法构建模块,类似 DTD,但更加强大. 作用有: ①定义 ...

  2. 28.XSD(XML Schema Definition)用法实例介绍以及C#使用xsd文件验证XML格式

    转自https://www.cnblogs.com/gdjlc/archive/2013/09/08/3308229.html XML Schema 语言也称作 XML Schema 定义(XML S ...

  3. 使用架构(XSD)验证XML文件

    假使说XML是一个数据库,那么XSD就是这个数据库的结构.由此可见,XSD是如此重要,如果没有它,我们如何声明以及验证我们需要的XML数据文件的格式和合法性呢?那是不可能完成的任务,如果你将XML数据 ...

  4. Delphi 7验证XML合法性(利用DTD、XSD)

    拥有正确语法的XML被称为“形式良好”的XML.通过DTD验证的XML是“合法”的XML.DTD(文档类型定义)的作用是定义XML 文档的合法构建模块.它使用一系列的合法元素来定义文档结构.XML S ...

  5. C# xsd 验证 XML数据有效性 问题

    使用XSD进行批量数据导入时生成的XML数据有效性这样的功能已经不是第一次做了,之前做的时候都没有碰到什么问题,这些天在开发中遇到了一个很头痛的问题就是无论XSD文件规则怎么写,验证都是通过的. 下面 ...

  6. C# 利用Xsd验证xml

    最近做项目时,用到了xml的序列化与反序列化, 发现最好用xsd来验证xml, 因为反序列化xml不校验xsd. 方法:xmlData变量为xml字符串 MemoryStream ms = new M ...

  7. C# 使用xsd文件验证XML 格式是否正确

    C# 使用xsd文件验证XML 格式是否正确 核心示例代码: //创建xmlDocument XmlDocument doc = new XmlDocument(); //创建声明段 如<?xm ...

  8. Postman使用tv4进行JSON Schema结构验证和断言

    JSON Scheme简介 对于JSON格式的请求数据或者响应数据,在不同的数据和场景下往往会有一部分动态的值及字段.此时我们可以使用JSON Scheme Validator(JSON结构验证)来验 ...

  9. XSD - <schema> 元素

    <schema> 元素 <schema> 元素是每一个 XML Schema 的根元素: <?xml version="1.0"?> <x ...

随机推荐

  1. Scrum生命周期

    Recently while cleaning up my photo albums I found some interesting old pictures which were captured ...

  2. 【博弈论】【SG函数】poj2311 Cutting Game

    由于异或运算满足结合律,我们把当前状态的SG函数定义为 它所能切割成的所有纸片对的两两异或和之外的最小非负整数. #include<cstdio> #include<set> ...

  3. [CEOI2017]One-Way Streets

    题目大意: 给你一个无向图,现在告诉你一些点对(u,v), 要你在保证从u到v的所有路径都不变的情况下,尽可能把所有的边变成单向边, 问你可以唯一确定哪些边的方向,以及方向是从u到v还是从v到u. 思 ...

  4. Vimperator常用快捷键

    分别往下/往上滚动窗口一行 j/k 左右滚动窗口     h/l 向下/向上滚动一屏的窗口 <Space>/<C-b> 向下/向上滚动半屏的窗口 <C-d>/< ...

  5. 使用history命令查看作业的整体执行情况

    1)通过使用history命令,我们可以深入到一个Job的任务级层面查看执行最快的任务,以及执行最慢的任务,以及其他的有用信息.命令如下: hadoop job -history /output “/ ...

  6. Kingdee Apusic 中间件有关资料

    Kingdee Apusic 中间件有关资料: 1.官方网站:http://www.apusic.com 2.资料目录:http://www.apusic.com/dist 3.Apusic 8 资料 ...

  7. python函数getopt用法

    python内建模块,用来处理命令行参数 格式:getopt(args, shortopts, longopts = []) 参数args一般是sys.argv[1:]sys.argv[0]表示执行文 ...

  8. Gradle项目学习 & HttpAsyncClient学习 & CountDownLatch学习

    装了Intellij,就是装了Gradle. 新建一个Gradle项目.然后下面这个页面要勾选上面两项: Use auto-import和Create directories for empty co ...

  9. java.io.IOException: Attempted read from closed stream. 异常,解决

    在HttpClient请求的时候,返回结果解析时出现java.io.IOException: Attempted read from closed stream. 异常,解决 原因是EntityUti ...

  10. xunsearch使用namespace后bug修复

    xunsearch在使用了namespace后会出现不能正常使用 错误例如以下: Fatal error: Uncaught [vendors\xunsearch\lib\XSException] . ...