import java.io.File; import java.io.FileNotFoundException; 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 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/dest.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); } /** * @param express 节点路径 * @param source 根节点 * @return 返回指定节点 */ 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) { e.printStackTrace(); } return result; } /** * @param express 节点路径 * @param source 根节点 * @return 返回指定节点下的所有结果集 */ 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; } /** * 将修改或增加过记录的xml写入源文件 * @param node 已经被改变的根节点 */ private void xml2File(Node node) { TransformerFactory tFactory = TransformerFactory.newInstance(); try { 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)); } catch (TransformerConfigurationException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (TransformerException e) { e.printStackTrace(); } } /** * 根据.xsd文件校验参数类型是否合法 * @param node 根节点参数 */ private void validate(Node node) { SchemaFactory schemaFactory = SchemaFactory .newInstance("http://www.w3.org/2001/XMLSchema"); File xsdFile = new File("xml/students.xsd"); //校验文件 try { Schema schema = schemaFactory.newSchema(xsdFile); Validator validator = schema.newValidator(); Source source = new DOMSource(node); Result result = new DOMResult(); validator.validate(source, result); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } 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 void traceDomTree() { NodeList children = root.getChildNodes(); for (int i = 0; i < children.getLength(); i++) { System.out.println("第"+(i+1)+"条记录:"); 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()); } } /** * 插入一条记录 */ public void insertOneNode() { Element theStudent = document.createElement("STUDENT"); theStudent.setAttribute("STUDENT_ID", "11111"); Element theElement = document.createElement("PASSWORD"); theElement.setTextContent("1234567"); theStudent.appendChild(theElement); theElement = document.createElement("FIRST_NAME"); theElement.setTextContent("双江"); theStudent.appendChild(theElement); theElement = document.createElement("LAST_NAME"); theElement.setTextContent("李"); theStudent.appendChild(theElement); theElement = document.createElement("MAJOR_NUMBER"); theElement.setTextContent("14"); theStudent.appendChild(theElement); root.appendChild(theStudent); validate(root); xml2File(root); } /** * 删除一条记录 */ public void deleteOneNode(int studentId) { Element theStudent = (Element) selectSingleNode( "/STUDENTS/STUDENT[@STUDENT_ID='"+studentId+"']", root); Node root = theStudent.getParentNode(); root.removeChild(theStudent); validate(root); xml2File(root); } /** * 更新一条记录 */ public void updateOneNode() { Element theStudent = (Element) selectSingleNode( "/STUDENTS/STUDENT[FIRST_NAME='Miao']", root); theStudent.getElementsByTagName("MAJOR_NUMBER").item(0).setTextContent( "44"); validate(root); xml2File(root); } public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException { DomParser parser = new DomParser(); parser.updateOneNode(); parser.traceDomTree(); } }
import org.xml.sax.ErrorHandler; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; public class MyXmlErrorHandler implements ErrorHandler { @Override public void error(SAXParseException exception) throws SAXException { exception.printStackTrace(); } @Override public void fatalError(SAXParseException exception) throws SAXException { exception.printStackTrace(); } @Override public void warning(SAXParseException exception) throws SAXException { exception.printStackTrace(); } }
dest.xml文件如下: <?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>建斌</FIRST_NAME> <LAST_NAME>成</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>
students.xml格式文件如下: <?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>