`
Aga
  • 浏览: 218704 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

对xml进行解析;进行增删改查还有schema验证

    博客分类:
  • J2SE
阅读更多
现在网络上的关于解析xml的资料很多,但是利用schema解析的不是很多;所以我进行了下总结,包括xml的读取、分析、修改、查询。还有就是根据schema进行验证,当然,都是最基本的东西。
部分代码摘自:《core java volume2》,以及:http://blog.csdn.net/cds27/archive/2008/03/02/2139110.aspx
言语无用,直接上代码。
<?xml version="1.0" encoding="UTF-8"?>  
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"  
    elementFormDefault="qualified">  
    <xs:element name="STUDENTS" type="students-type" />  
    <xs:complexType name="students-type">  
        <xs:sequence maxOccurs="unbounded">  
            <xs:element name="STUDENT" type="student-type" />  
        </xs:sequence>  
    </xs:complexType>  
    <xs:complexType name="student-type">  
        <xs:sequence>  
            <xs:element name="PASSWORD" type="xs:string" />  
            <xs:element name="FIRST_NAME" type="xs:string" />  
            <xs:element name="LAST_NAME" type="xs:string" />  
            <xs:element name="MAJOR_NUMBER" type="xs:integer" />  
            <xs:any minOccurs="0" />  
        </xs:sequence>  
        <xs:attribute name="STUDENT_ID" type="xs:integer" use="required"/>  
    </xs:complexType>  
</xs:schema>

<?xml version="1.0" encoding="UTF-8"?>  
<STUDENTS xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:noNamespaceSchemaLocation="students.xsd">  
    <STUDENT STUDENT_ID="1">  
        <PASSWORD>19841230</PASSWORD>  
        <FIRST_NAME>Xiangzhong</FIRST_NAME>  
        <LAST_NAME>Chang</LAST_NAME>  
        <MAJOR_NUMBER>7</MAJOR_NUMBER>  
    </STUDENT>  
    <STUDENT STUDENT_ID="2">  
        <PASSWORD>19841230</PASSWORD>  
        <FIRST_NAME>Miao</FIRST_NAME>  
        <LAST_NAME>Wu</LAST_NAME>  
        <MAJOR_NUMBER>7</MAJOR_NUMBER>  
    </STUDENT>  
    <STUDENT STUDENT_ID="3">  
        <PASSWORD>19841230</PASSWORD>  
        <FIRST_NAME>Juntai</FIRST_NAME>  
        <LAST_NAME>Wang</LAST_NAME>  
        <MAJOR_NUMBER>7</MAJOR_NUMBER>  
    </STUDENT>  
</STUDENTS>

package com.cxz.xml.dom;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;

public class DomParser {
	private static final int FLAG_TRACE = 1;

	private static final int FLAG_INSERT = 2;

	private static final int FLAG_DELETE = 3;

	private static final int FLAG_UPDATE = 4;

	private static final String JAXP_SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage";

	private static String W3C_XML_SCHEMA = "http://www.w3c.org/2001/XMLSchema";

	private static String W3C_APACHE = "http://apache.org/xml/features/validation/schema";

	File xmlFile = new File("xml/freshman.xml");

	DocumentBuilderFactory xmlfactory = null;

	DocumentBuilder builder = null;

	Document document = null;

	Element root = null;

	public DomParser() throws ParserConfigurationException, SAXException,
			IOException {
		xmlfactory = DocumentBuilderFactory.newInstance();
		xmlfactory.setValidating(true);
		xmlfactory.setNamespaceAware(true);
		xmlfactory.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);
		xmlfactory.setFeature(W3C_APACHE, true);
		xmlfactory.setIgnoringElementContentWhitespace(true);
		builder = xmlfactory.newDocumentBuilder();
		builder.setErrorHandler(new MyXmlErrorHandler());
		builder = xmlfactory.newDocumentBuilder();
		document = builder.parse(xmlFile);
		root = document.getDocumentElement();
		removeWhilespace(root);
	}

	private void doSth(int flag) {
		switch (flag) {
		case FLAG_TRACE:
			traceDomTree();
			break;
		case FLAG_INSERT:
			insertOneNode();
			break;
		case FLAG_DELETE:
			deleteOneNode();
			break;
		case FLAG_UPDATE:
			updateOneNode();
			break;
		}
	}

	private void traceDomTree() {//遍历
		NodeList children = root.getChildNodes();
		for (int i = 0; i < children.getLength(); i++) {
			Element child = (Element) children.item(i);
			Element element = (Element) child.getFirstChild();
			while (element.getNextSibling() != null) {
				System.out.println(element.getTextContent());
				element = (Element) element.getNextSibling();
			}
			System.out.println(element.getTextContent());
		}
	}

	private void insertOneNode() {
		Element theStudent = document.createElement("STUDENT");
		theStudent.setAttribute("STUDENT_ID", "2003710201");

		Element theElement = document.createElement("PASSWORD");
		theElement.setTextContent("[137Joanna]");
		theStudent.appendChild(theElement);

		theElement = document.createElement("FIRST_NAME");
		theElement.setTextContent("Chang");
		theStudent.appendChild(theElement);

		theElement = document.createElement("LAST_NAME");
		theElement.setTextContent("Xiangzhong");
		theStudent.appendChild(theElement);

		theElement = document.createElement("MAJOR_NUMBER");
		theElement.setTextContent("1");
		theStudent.appendChild(theElement);

		root.appendChild(theStudent);
		try {
			xml2File(root);
			validate(root);
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (TransformerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	private void deleteOneNode() {
		Element theStudent = (Element) selectSingleNode(
				"/STUDENTS/STUDENT[@STUDENT_ID='3']", root);
		output(theStudent.getParentNode());
		Node root = theStudent.getParentNode();
		root.removeChild(theStudent);
		output(root);
	}

	private void updateOneNode() {
		Element theStudent = (Element) selectSingleNode(
				"/STUDENTS/STUDENT[FIRST_NAME='Miao']", root);
		output(theStudent.getParentNode());
		theStudent.getElementsByTagName("MAJOR_NUMBER").item(0).setTextContent(
				"99999999999999999999");
		output(theStudent.getParentNode());
	}

	private Node selectSingleNode(String expression, Object source) {
		XPathFactory xPathFactory = XPathFactory.newInstance();
		XPath xPath = xPathFactory.newXPath();
		Node result = null;
		try {
			result = (Node) xPath.evaluate(expression, source,
					XPathConstants.NODE);
		} catch (XPathExpressionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return result;
	}

	public static NodeList selectNodes(String express, Object source) {
		NodeList result = null;
		XPathFactory xpathFactory = XPathFactory.newInstance();
		XPath xpath = xpathFactory.newXPath();
		try {
			result = (NodeList) xpath.evaluate(express, source,
					XPathConstants.NODESET);
		} catch (XPathExpressionException e) {
			e.printStackTrace();
		}

		return result;
	}

	private void xml2File(Node node) throws IOException, TransformerException {
		TransformerFactory tFactory = TransformerFactory.newInstance();
		Transformer transformar = tFactory.newTransformer();
		File file = new File("xml/dest.xml");
		file.createNewFile();
		Source source = new DOMSource(node);
		FileOutputStream out = new FileOutputStream(file);
		transformar.transform(source, new StreamResult(out));
	}

	private void validate(Node node) throws SAXException, IOException {
		SchemaFactory schemaFactory = SchemaFactory
				.newInstance("http://www.w3.org/2001/XMLSchema");
		File xsdFile = new File("xml/students.xsd");
		Schema schema = schemaFactory.newSchema(xsdFile);
		Validator validator = schema.newValidator();
		Source source = new DOMSource(node);
		Result result = new DOMResult();
		validator.validate(source, result);
	}

	private int removeWhilespace(Element element) {
		int count = 0;
		NodeList children = element.getChildNodes();
		if (children.getLength() <= 1) {
			return 0;
		} else {
			for (int i = children.getLength() - 1; i >= 0; i--) {
				Node child = children.item(i);
				if (child instanceof Text
						&& ((Text) child).getData().trim().length() == 0) {
					element.removeChild(child);
					count++;
				} else if (child instanceof Element) {
					count += removeWhilespace((Element) child);
				}
			}
		}
		return count;
	}

	public static void output(Node node) {
		TransformerFactory transFactory = TransformerFactory.newInstance();
		try {
			Transformer transformer = transFactory.newTransformer();
			transformer.setOutputProperty("indent", "yes");

			DOMSource source = new DOMSource();
			source.setNode(node);
			StreamResult result = new StreamResult();
			result.setOutputStream(System.out);

			transformer.transform(source, result);
		} catch (TransformerConfigurationException e) {
			e.printStackTrace();
		} catch (TransformerException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) throws ParserConfigurationException,
			SAXException, IOException {
		DomParser parser = new DomParser();
		parser.doSth(FLAG_TRACE);
		parser.doSth(FLAG_INSERT);
		parser.doSth(FLAG_DELETE);
		parser.doSth(FLAG_UPDATE);
	}

}
  • xml.jar (6.1 KB)
  • 下载次数: 75
  • Research.rar (17.4 KB)
  • 描述: xml验证,以及动态部署的例子
  • 下载次数: 82
6
0
分享到:
评论

相关推荐

    对XML进行增删改查例子

    在这个“对XML进行增删改查例子”中,我们将探讨如何操作XML文档,包括添加新节点、删除已有节点、修改现有节点内容以及查询XML结构中的特定信息。 1. **XML的基本结构** XML文档由一系列元素组成,每个元素都有一...

    增删改查xml数据

    以下是对XML数据进行增删改查操作的详细说明: 1. **创建XML文档** 创建XML文档首先需要遵循XML的语法规则,例如声明文档类型、定义元素、属性等。一个基本的XML文档结构如下: ```xml &lt;?xml version="1.0" ...

    XML增删改查经典示例--.rar

    "XML增删改查"是指在XML文档中进行添加、删除、修改和查询数据的基本操作,这些操作是理解和应用XML的关键技能。 1. **XML文档结构** - **文档声明**: XML文档以`&lt;?xml version="1.0" encoding="UTF-8"?&gt;`开始,...

    XML文件解析编辑小工具

    它可以进行XML的增删改查操作,支持XML节点的拖放操作,以及XML文档的格式化,使代码更加整洁。此外,它还具备查找和替换功能,帮助用户快速定位并修改XML文档中的特定内容。 对于XML的复杂性,如XPath(XML Path ...

    xml课程设计

    3. **XML解析器**:了解如何使用DOM(Document Object Model)、SAX(Simple API for XML)和StAX(Streaming API for XML)等解析器来处理XML文档。DOM将整个XML文档加载到内存中形成一棵树,便于遍历和修改;SAX是...

    PB11.5解析XML实例

    3. `IXMLDOMElement`和`IXMLDOMAttribute`接口的使用,包括元素和属性的增删改查。 4. XML Schema验证以确保数据的正确性。 通过学习这个实例,开发者能够掌握PowerBuilder中处理XML的基本技巧,进一步提升其在应用...

    XML-大作业.zip

    5. 实际应用:可能需要模拟一个实际场景,如创建一个XML数据文件,然后使用XML技术进行处理,例如数据的增删改查操作。 6. 数据绑定:理解如何将XML数据与应用程序中的对象模型绑定,实现数据的动态更新和展示。 在...

    商业编程-源码-介绍两个 XML 文件操作类.zip

    在实际应用中,这两个类可能提供了一些方便的抽象方法,比如读取XML配置文件、序列化和反序列化XML数据、以及对XML数据的增删改查操作。为了提高代码的可读性和可维护性,这些类可能会遵循一定的设计模式,如工厂...

    XML大作业、

    XML(eXtensible Markup Language)是一种用于标记数据的语言,其设计目的是传输和存储数据,而非显示数据。在本“XML大作业”中,...通过这样的作业,学生能够深入理解XML的使用,并能熟练地进行数据的增删改查操作。

    XML简单学籍管理程序

    4. 增删改查操作:添加新学生、删除学生、更新学生信息等。 5. 输出展示:将查询结果以友好的方式显示给用户,可能是表格或者简单的文本列表。 开发这样的系统,我们需要了解XML的基本语法,如元素、属性、命名空间...

    基于Vue的JSON可视化编辑器通过定义JSONSchema直接生成UI界面

    5. **处理数据**:在组件内部,你需要处理JSON数据的增删改查,并同步到UI上。 6. **样式定制**:根据需求,可以使用CSS预处理器(如Sass或Less)对生成的UI进行样式定制。 7. **交互逻辑**:添加事件监听器以响应...

    XML应用开发(软件品牌)-1期 01-《XML应用开发》-课程简介.doc

    6. **实践项目**:通过实际项目,让学生运用所学知识解决实际问题,如创建XML文件,编写解析XML的程序,实现XML数据的增删改查操作等。 7. **XML相关工具**:介绍XML编辑器、验证工具,如XML Spy,以及调试工具,...

    在C# asp.net中如何操作XML

    - DOM模型允许整个XML文档加载到内存中,方便进行增删改查操作,但不适合大型XML文件,因为它会占用大量内存。 11. **SAX解析器**: - 作为轻量级的解析方式,SAX不将整个XML文档加载到内存,而是通过事件驱动的...

    XML高级编程pdf(9,10)

    章节可能涉及DOM树的构建、节点遍历、元素和属性的增删改查等。 3. **SAX解析**:SAX是一种事件驱动的解析方式,适用于处理大型XML文档。本章可能会介绍如何使用SAX解析器进行逐事件处理,以及事件处理类的编写。 ...

Global site tag (gtag.js) - Google Analytics