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. Lookup 组件用法全解

    Lookup是查找的意思,Lookup组件实现两个数据源的连接,和Join语句实现的功能类似,使用Lookup 组件需要配置: 两个输入:一个是上游数据流的输入Source Table,一个是要查找的 ...

  2. 51nod 子序列的个数(动态规划)

    子序列的个数 给定一个正整数序列,序列中元素的个数和元素值大小都不超过105, 求其所有子序列的个数.注意相同的只算一次:例如 {1,2,1}有子序列{1} {2} {1,2} {2,1}和{1,2, ...

  3. mysql对表的操作

    创建表 简单的方式 CREATE TABLE person ( number INT(11), name VARCHAR(255), birthday DATE ); 或者是 CREATE TABLE ...

  4. [九省联考2018]林克卡特树(DP+wqs二分)

    对于k=0和k=1的点,可以直接求树的直径. 然后对于60分,有一个重要的转化:就是求在树中找出k+1条点不相交的链后的最大连续边权和. 这个DP就好.$O(nk^2)$ 然后我们完全不可以想到,将b ...

  5. [BZOJ 4082] Surveillance

    Link: BZOJ 4082 传送门 Solution: 对于链上这样的问题贪心就好了 如果在一个环上,肯定需要将环转化成链,$O(n)$确定起点才能计算 但枚举每个节点拆环再贪心的复杂度为$O(n ...

  6. [BZOJ 1566] 管道取珠

    Link:https://www.lydsy.com/JudgeOnline/problem.php?id=1566 Solution: 思路十分精奇的一道题目 题目要求的是$\sum_{i=1}^k ...

  7. 【分类讨论】Codeforces Round #395 (Div. 2) D. Timofey and rectangles

    D题: 题目思路:给你n个不想交的矩形并别边长为奇数(很有用)问你可以可以只用四种颜色给n个矩形染色使得相接触的 矩形的颜色不相同,我们首先考虑可不可能,我们分析下最多有几个矩形互相接触,两个时可以都 ...

  8. (转)[Unity3D]关于Assets资源目录结构管理

    分享个我们项目常用的目录结构,微调过很多次,最终到了这个版本.个人认为这种管理资源方式是不错的.欢迎探讨各个细节~ 更新于2013.5.30   Asserts   --Editor 自写的灵活方便插 ...

  9. 杂谈PID控制算法——第一篇:三个量

    电赛训练了大半个暑假,人渐渐开始进入到了疲倦期.既然这样那就好好休息下自己也好吧. 休息也不能光休息,乘机把平常写过的一些东西好好整理也好. 从第一次训练开始我们就接触到了一个新的名词——PID控制理 ...

  10. [PATCH] ARM: add dtbImage.<dt> and dtbuImage.<dt> rules

    转载: http://permalink.gmane.org/gmane.linux.kbuild.devel/8755 This rules are useful for appended devi ...