`

使用libxml根据schema验证xml的合法性

    博客分类:
  • php
阅读更多
<?php
/*
Author: fuliang http://fuliang.iteye.com
*/
class XMLValidation{
	private $xml_path;
	private $schema_path;

	public function __construct($xml_path,$schema_path){
		$this->xml_path = $xml_path;
		$this->schema_path = $schema_path;
	}

	function validate(){
		libxml_use_internal_errors(true);
		$xml = new DOMDocument();
		$xml->load($this->xml_path);
		if($xml->schemaValidate($this->schema_path)){
			echo "The xml is valid\n";
		}else{
			$this->pretty_print_errors();
		}
	}

	function pretty_print_errors(){
		$errors = libxml_get_errors();
		$error_count = count($errors);
		echo "Total num of errors is: $error_count\n";

		for($i = 0; $i < $error_count; $i++){
			$this->fmt_error_with_num($i+1,$errors[$i]);
		}
		libxml_clear_errors();
	}

	function fmt_error_with_num($num, $error){
		echo "Error $num: ".trim($error->message)." in file " . $error->file . " on line " .$error->line. "\n";
	}
	
}

$xml_validation = new XMLValidation("test.xml","test.xsd");
$xml_validation->validate();
?>

test.xsd:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
	<xs:simpleType name="stringType">
		<xs:restriction base="xs:string">
			<xs:pattern value="[a-z]{6}"/>
		</xs:restriction>
	</xs:simpleType>

	<xs:element name="person">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="name" type="stringType" minOccurs="0"/>
				<xs:element name="age" type="xs:positiveInteger"/>
				<xs:element name="address" type="xs:string"/>
				<xs:element name="city" type="xs:string"/>
				<xs:element name="country" type="xs:string"/>
			</xs:sequence>
			<xs:attribute name="person_id" type="xs:string" use="required"/>
		</xs:complexType>
	</xs:element>
</xs:schema>

test.xml
<?xml version="1.0"?>
<person>
	<name>133</name>
	<age>22</age>
	<address>beijing haidian</address>
	<city>beijing</city>
	<country>China</country>		
</person>

输出结果:
引用

Error 1: Element 'person': The attribute 'person_id' is required but missing. in file /home/fuliang/program/php/test.xml on line 2
Error 2: Element 'name': [facet 'pattern'] The value '133' is not accepted by the pattern '[a-z]{6}'. in file /home/fuliang/program/php/test.xml on line 3
Error 3: Element 'name': '133' is not a valid value of the atomic type 'stringType'. in file /home/fuliang/program/php/test.xml on line 3

重新修改一下xml
<?xml version="1.0"?>
<person person_id="123">
	<name>aaaaaa</name>
	<age>22</age>
	<address>beijing haidian</address>
	<city>beijing</city>
	<country>China</country>		
</person>

输出信息:
引用

The xml is valid

需要注意的是行号类型是short的,超过65535就会越界,需要自己纠正这个错误。
分享到:
评论

相关推荐

    libxml2-解析xml格式文件

    **libxml2库详解** ...总之,libxml2-2.7.4库为XML处理提供了一整套全面的解决方案,无论是解析、生成还是验证XML文件,都表现出卓越的性能和易用性。开发者可以根据项目需求,选择合适的API来高效地处理XML数据。

    c++中使用libxml2读取xml文件

    ### C++中使用libxml2读取XML文件详解 #### 一、引言 随着XML(可扩展标记语言)在数据交换与存储领域的广泛应用,掌握如何有效地读取和解析XML文件成为了开发人员的一项必备技能。在C++环境中,libxml2库因其功能...

    libxml2test_xml_文本解析_capturedetv_

    在"libxml2test_xml_文本解析_capturedetv_"这个项目中,我们可能看到的是一个使用libxml2库编写的测试程序,该程序可能包括以下步骤: 1. 加载XML文件:使用`xmlReadFile`或`xmlParseDoc`函数读取XML文件。 2. 遍历...

    Ubuntu下C语言使用libxml2库创建、解析xml文件

    在Ubuntu操作系统中,C语言开发过程中,我们可能会遇到需要处理XML文件的需求。XML(Extensible Markup Language)是一种标记语言,广泛...在实际项目中,记得根据具体需求进行优化和扩展,确保代码的稳定性和性能。

    libxml2生成,解析,修改xml文件

    利用libxml2生成,解析,修改xml文件示例,安装libxml2库, sudo apt-...使用libxml2库进行xml文件的操作,取出了平台差异化,便于在不同的平台都可以进行文件的操作,不受平台系统的限制,可以实现一次编码,多次编译

    C语言基于cjson库libxml2库的xmljson互转

    本程序是用C语言基于cjson库libxml2库编写的XML与JSON互转

    XML-LibXML-2.0126.tar.gz

    XML(eXtensible Markup Language)是一种用于标记数据的语言,广泛应用于网络数据交换、文档存储以及配置文件等领域。...通过理解和使用LibXML,开发者可以更有效地处理XML文档,提高应用程序的灵活性和互操作性。

    C语言解析XML,libxml包

    由于XML注入攻击的可能性,使用libxml2时应确保输入的数据经过适当验证和清理,防止恶意构造的XML文档导致安全问题。 总结来说,libxml2是C语言中处理XML的强大工具,通过其提供的API,开发者可以高效地解析、操作...

    tinyxml和libxml2

    东西不算新东西,全部是从别人那里盗过来的 但代码都亲自进行了调试,并将他人的测试桩都补充的相当完整,并重写了Makefile

    xml.tar.gz_libxml2_linux c xml_linux xml

    libxml2是 GNOME 项目开发的一个强大的开源XML处理库,它提供了多种功能,包括XML文档的解析、验证、序列化以及XPath、XInclude、XPointer和XML Schema支持。本教程将深入讲解如何利用libxml2库在C++环境中进行XML...

    LIBXML2 X64位

    3. **XML Schema验证**:可以验证XML文档是否符合指定的XML Schema规范。 4. **XML编码转换**:libxml2库包含各种字符编码的转换函数,确保XML文档在不同编码环境中的兼容性。 5. **内存管理**:libxml2提供了一套...

    windows 下使用libxml的简单小示例

    在Windows环境下,使用libxml库解析XML文档是一个常见的任务,特别是在进行数据处理、网络通信或者软件开发时。libxml2是 GNOME 项目的一个组件,它是一个功能强大的XML解析库,支持多种操作系统,包括Windows。本...

    使用mingw编译后的libxml2-2.7.7安装包

    这个库不仅支持XML,还支持HTML、XHTML、SVG等多种格式,并且包含了XML解析、XPath处理、XML Schema验证等功能。libxml2-2.7.7是该库的一个特定版本,可能包含了一些特定的改进和修复。 ** 安装包内容** 这个...

    对libxml2封装的简单C++ xml操作类,libxml入门经典

    这通常意味着该教程会涵盖XML的基本概念,以及如何利用libxml2库提供的API进行XML解析和操作,同时简化了这些操作的复杂性,便于学习和实践。 **标签:“xml”:** “xml”标签明确了讨论的主题是XML(可扩展标记...

    libxml2-2.9.0.tar.gz

    4. **XML Schema验证**:libxml2可以验证XML文档是否符合预先定义的XML Schema,确保数据的正确性和一致性。 5. **HTML处理**:除了XML,libxml2还支持HTML解析,允许开发者在处理Web内容时使用相同的方法和接口。 ...

    libxml2使用示例

    4. **DTD和XML Schema验证**:libxml2可以验证XML文档是否符合指定的DTD或XML Schema,通过`xmlValidateDtd()`和`xmlSchemaValidateDoc()`等函数。 5. **内存管理**:libxml2提供了一套完整的内存管理机制,包括...

    libxml VC范例代码

    - Libxml还支持XML Schema和Relax NG验证,以及DTD(文档类型定义)验证。 2. **Visual Studio 2008:** - Microsoft 的 Visual Studio 是一个强大的开发工具集,2008版本支持C++, C#, VB.NET等多种编程语言。 -...

    libxml2开源库 libxml2开源库 libxml2开源库

    - **XML Schema和DTD验证**:支持XML Schema和DTD(Document Type Definition)文档的验证,确保XML文档符合预定义的结构规则。 - **命名空间**:处理XML文档中的命名空间,确保元素和属性的唯一性。 ### 2. 使用...

    libxml2-2.9.14源码

    **libxml2库详解** Libxml2是XML处理的一个强大且高效的开源库,它由Gnome...通过学习和使用libxml2-2.9.14源码,开发者不仅可以掌握XML处理的基础知识,还能深入了解XML技术在实际项目中的应用,提升自己的编程技能。

    libxml2安装包及中文手册

    4. **XML Schema验证**:libxml2可以对XML文档进行Schema验证,确保其符合预定义的规范。 5. **命名空间支持**:libxml2处理XML命名空间,使处理带有相同标签但属于不同命名空间的元素变得简单。 6. **编码转换**:...

Global site tag (gtag.js) - Google Analytics