java解析svg文件
- 格式:doc
- 大小:32.50 KB
- 文档页数:5
java解析超⼤xml(1G),⼀般数据挖掘dblp.xml⽂件的解析在⽹上找了很多关于解析超⼤xml的例⼦,都说java再带的jar包中有相关的SAXparse类来解析xml,但是试过了好多次,之后还是不⾏,还有dom4j.jar等等,都不能解析太多条数的xml,⼤概超过30M,就会解析报错。
不过偶尔看到过xercesImpl.jar,sax2.jar,jaxen-1.1.1.jarimport java.io.IOException;import javax.xml.parsers.ParserConfigurationException;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import java.io.File;import org.xml.sax.SAXException;public class SAX {public static void main(String[] args) {try {SAXParserFactory factory=SAXParserFactory.newInstance();factory.setNamespaceAware(true);factory.setValidating(true);SAXParser parser=factory.newSAXParser();SAXparse p1=new SAXparse();parser.parse(new File("D:\\dblp.xml"), p1);} catch (ParserConfigurationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SAXException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}} 或者import java.io.FileWriter;import java.io.IOException;import java.io.InputStream;import java.util.Iterator;import java.util.List;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.io.SAXReader;/****/public class XMLParse {private String configName = "dblp_little.xml";private SAXReader saxReader;private Document doc;private Element root;/***/public XMLParse() {// InputStream in = Thread.currentThread().getContextClassLoader()// .getResourceAsStream(configName);saxReader = new SAXReader();try {doc = saxReader.read(configName);} catch (DocumentException e) {e.printStackTrace();}root = doc.getRootElement();}/*** get Data Type** @throws IOException*/public void getModelElement(String attribute) {FileWriter fileWriter = null;try {fileWriter = new FileWriter(attribute + ".txt");} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}List list = root.elements();Element model = null;List childList = null;Element modelEle = null;Element returnModel = null;String dataType = null;StringBuffer sb = new StringBuffer();int temp = 0;for (Iterator it = list.iterator(); it.hasNext();) {model = (Element) it.next();temp++;System.out.println("temp:"+temp);childList = model.elements();for (Iterator ite = childList.iterator(); ite.hasNext();) {modelEle = (Element) ite.next();if (attribute.equals(modelEle.getName())) {dataType = modelEle.getText();dataType = dataType;if (sb.length() > 1) {sb.append(",");}sb.append(dataType);}}dataType = sb.toString();if (!"".equals(dataType)) { // 没有值的话,跳过往txt中写值try {fileWriter.write(dataType);fileWriter.write("\r\n");} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}sb.delete(0, sb.length());try {fileWriter.flush();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}try {// fileWriter.flush();fileWriter.close();System.out.println("xml解析成功,并成功写⼊到"+attribute+".txt ⽂件中!"); } catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("list.size:"+list.size());}public static void main(String[] args) {// TODO Auto-generated method stubString attribute = null;XMLParse parse = new XMLParse();attribute = "author";parse.getModelElement(attribute);}}。
java解析xml⽂件四种⽅式1.介绍1)DOM(JAXP Crimson解析器)DOM是⽤与平台和语⾔⽆关的⽅式表⽰XML⽂档的官⽅W3C标准。
DOM是以层次结构组织的节点或信息⽚断的集合。
这个层次结构允许开发⼈员在树中寻找特定信息。
分析该结构通常需要加载整个⽂档和构造层次结构,然后才能做任何⼯作。
由于它是基于信息层次的,因⽽DOM被认为是基于树或基于对象的。
DOM以及⼴义的基于树的处理具有⼏个优点。
⾸先,由于树在内存中是持久的,因此可以修改它以便应⽤程序能对数据和结构作出更改。
它还可以在任何时候在树中上下导航,⽽不是像SAX那样是⼀次性的处理。
DOM使⽤起来也要简单得多。
2)SAXSAX处理的优点⾮常类似于流媒体的优点。
分析能够⽴即开始,⽽不是等待所有的数据被处理。
⽽且,由于应⽤程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。
这对于⼤型⽂档来说是个巨⼤的优点。
事实上,应⽤程序甚⾄不必解析整个⽂档;它可以在某个条件得到满⾜时停⽌解析。
⼀般来说,SAX还⽐它的替代者DOM快许多。
选择DOM还是选择SAX?对于需要⾃⼰编写代码来处理XML⽂档的开发⼈员来说,选择DOM还是SAX解析模型是⼀个⾮常重要的设计决策。
DOM采⽤建⽴树形结构的⽅式访问XML⽂档,⽽SAX采⽤的事件模型。
DOM解析器把XML⽂档转化为⼀个包含其内容的树,并可以对树进⾏遍历。
⽤DOM解析模型的优点是编程容易,开发⼈员只需要调⽤建树的指令,然后利⽤navigation APIs访问所需的树节点来完成任务。
可以很容易的添加和修改树中的元素。
然⽽由于使⽤DOM解析器的时候需要处理整个XML⽂档,所以对性能和内存的要求⽐较⾼,尤其是遇到很⼤的XML⽂件的时候。
由于它的遍历能⼒,DOM解析器常⽤于XML⽂档需要频繁的改变的服务中。
SAX解析器采⽤了基于事件的模型,它在解析XML⽂档的时候可以触发⼀系列的事件,当发现给定的tag的时候,它可以激活⼀个回调⽅法,告诉该⽅法制定的标签已经找到。
Java解析CSV⽂件并导出数据Java解析CSV⽂件并导出筛选过得数据pom.xml引⼊jar包<!--csv--><dependency><groupId>com.opencsv</groupId><artifactId>opencsv</artifactId><version>4.4</version></dependency>使⽤IO流解析,转化数组形式/*** <b>将csv⽂件通过IO流解析,转化数组形式的集合<b>** @param fileName ⽂件(路径+csv⽂件名)*/public static List<String[]> csv(String fileName) {List<String[]> csvList = new ArrayList<String[]>();if (null != fileName) {try {InputStreamReader is = new InputStreamReader(new FileInputStream(fileName),"gbk");CSVParser csvParser = new CSVParserBuilder().build();CSVReader reader = new CSVReaderBuilder(is).withCSVParser(csvParser).build();csvList = reader.readAll();}catch (UnsupportedEncodingException e){e.printStackTrace();}catch (IOException e) {e.printStackTrace();}}return csvList;}测试并解析需要的数据并导出到对应⽂件public static void main(String[] args) throws IOException {// 读取的csv⽂件List<String[]> csv = csv("F:/interCode/interCode.csv");// 保存数据的⽂件File file = new File("F:/interCode/interCode.txt");if (file.exists()) {file.mkdirs();}FileOutputStream outputStream = null;for (String[] strings : csv) {String trim = strings[0].trim();// 业务处理逻辑String s = encodeBase(trim);if (!s.equals("传递参数不完整!")) {outputStream = new FileOutputStream(file,true);byte[] bytes = s.getBytes();// 写⼊数据outputStream.write(bytes);// 换⾏outputStream.write("\r\n".getBytes());}}System.out.println("执⾏结束!");// 关闭流outputStream.close();}此处不做过多描述,C+V即⽤,根据⾃⾏情况稍加改动即可,代码中都有相关注释。
java解析xml⽂件⼀、SAX解析1、将要解析的xml⽂件为TestDom.xml<?xml version="1.0" encoding="utf-8"?><bookStore><book id="1" class="tonghua"><name>安徒⽣童话</name><author>安徒⽣</author><year>2008</year></book><book id="2" class="xiyouji"><name>西游记</name><author>罗贯中</author></book></bookStore>2、Book类package youth.hong.TestDom;public class Book {private String id = "";private String className = "";private String name = "";private String author = "";private String year = "";public Book(String id, String name, String author, String year) {super();this.id = id; = name;this.author = author;this.year = year;}public Book() {}@Overridepublic String toString() {return "Book [id=" + id + ", className=" + className + ", name=" + name + ", author=" + author + ", year=" + year + "]";}public String getClassName() {return className;}public void setClassName(String className) {this.className = className;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) { = name;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public String getYear() {return year;}public void setYear(String year) {this.year = year;}}3、解析xml的主类package youth.hong.Handler;import java.util.ArrayList;import java.util.List;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;import youth.hong.TestDom.Book;public class SAXHandler extends DefaultHandler{int bookIndex = 0;private List<Book> bookList = new ArrayList<Book>();private Book book = null;private String value = null;//⽤来标志解析开始@Overridepublic void startDocument() throws SAXException {System.out.println("解析开始");}//⽤来标志解析结束@Overridepublic void endDocument() throws SAXException {System.out.println("解析结束");}//⽤来遍历元素//开始标签@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {if(qName.equals("book")) {bookIndex++;book = new Book();System.out.println("============================第" + bookIndex + "本书开始了=========================");//已知book下属性元素的名称//System.out.println(attributes.getValue("id"));for(int i = 0; i < attributes.getLength(); i++) {String name = attributes.getQName(i);if(name.equals("id")) {book.setId(attributes.getValue(i));}else if(name.equals("class")) {book.setClassName(attributes.getValue(i));}book.setId(attributes.getValue(i));//System.out.println(name);System.out.println("第" + bookIndex + "本书的" + attributes.getQName(i) + "是:" + attributes.getValue(i)/*attributes.getValue(Qname)*/); }}else if(!qName.equals("bookStore")) {System.out.print("第" + bookIndex + "本书的" + qName + "是:");}}//遍历标签内的内容@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {value = new String(ch,start,length);//如果标签下没有内容,如bookstore与book之间就没有内容,将不打印if(!value.trim().equals("")) {System.out.println(value);}}//遍历元素的结束标签@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {if(qName.equals("book")) {bookList.add(book);book = null;System.out.println("============================第" + bookIndex + "本书结束了========================="); }else if(qName.equals("name")) {book.setName(value);}else if(qName.equals("author")) {book.setAuthor(value);}else if(qName.equals("year")) {book.setYear(value);}}public List<Book> getBookList() {return bookList;}}4、测试类(包括创建xml⽂件)package youth.hong.TestDom;import java.io.File;import java.io.FileOutputStream;import java.util.List;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import javax.xml.transform.OutputKeys;import javax.xml.transform.Result;import javax.xml.transform.Transformer;import javax.xml.transform.sax.SAXTransformerFactory;import javax.xml.transform.sax.TransformerHandler;import javax.xml.transform.stream.StreamResult;import org.xml.sax.helpers.AttributesImpl;import youth.hong.Handler.SAXHandler;public class SAXTest {public List<Book> parseXml() {SAXHandler saxhandler = null;SAXParserFactory parserFactory = SAXParserFactory.newInstance();try {SAXParser saxParser = parserFactory.newSAXParser();saxhandler = new SAXHandler();saxParser.parse("src/TestJDom/TestDom.xml", saxhandler);for (Book book : saxhandler.getBookList()) {System.out.println(book);}System.out.println();} catch (Exception e) {e.printStackTrace();};return saxhandler.getBookList();}/*** ⽣成xml⽂件*/public void createXml() {List<Book> bookList = this.parseXml();//转化⼯⼚SAXTransformerFactory tff = (SAXTransformerFactory)SAXTransformerFactory.newInstance();try {TransformerHandler handler = tff.newTransformerHandler();//转换器Transformer tf = handler.getTransformer();//设置输出编码为UTF-8tf.setOutputProperty(OutputKeys.ENCODING, "utf-8");//输出格式缩进tf.setOutputProperty(OutputKeys.INDENT, "yes");//要输出的⽂件File file = new File("src/TestJDom/newBook.xml");//如果⽂件不存在就创建⼀个if(!file.exists()) {file.createNewFile();}Result result = new StreamResult(new FileOutputStream(file));//必须在result定义完再加⼊内容才有效handler.setResult(result);handler.startDocument();AttributesImpl atts = new AttributesImpl();handler.startElement("", "", "bookStore", atts);//遍历所有书籍将他们加⼊到xml中for(Book book : bookList) {atts.clear();/*** public void addAttribute(String uri,String localName,命名空间本地名String qName,元素名String type,元素类型String value)值*/atts.addAttribute("", "", "id", null, book.getId());atts.addAttribute("", "", "class", null, book.getClassName());//注意按照SAX模式解析xml⽂件的顺序去定义标签handler.startElement("", "", "book", atts);atts.clear();handler.startElement("", "", "name", atts);char[] ch = book.getName().toCharArray();handler.characters(ch, 0, ch.length);handler.endElement("", "", "name");handler.startElement("", "", "author", atts);ch = book.getAuthor().toCharArray();handler.characters(ch, 0, ch.length);handler.endElement("", "", "author");handler.startElement("", "", "year", atts);ch = book.getYear().toCharArray();handler.characters(ch, 0, ch.length);handler.endElement("", "", "year");handler.endElement("", "", "book");}handler.endElement("", "", "bookStore");handler.endDocument();} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) {SAXTest saxTest = new SAXTest();//saxTest.createXml();saxTest.parseXml();}}5、⽣成newBook.xml⽂件<?xml version="1.0" encoding="utf-8"?><bookStore><book id="tonghua" class="tonghua"><name>安徒⽣童话</name><author>安徒⽣</author><year>2008</year></book><book id="xiyouji" class="xiyouji"><name>西游记</name><author>罗贯中</author><year/></book></bookStore>⼆、jdom解析1、解析与创建package youth.hong.TestJDom;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStreamReader;import java.util.ArrayList;import java.util.List;import org.jdom2.Attribute;import org.jdom2.Document;import org.jdom2.Element;import org.jdom2.JDOMException;import org.jdom2.input.SAXBuilder;import org.jdom2.output.Format;import org.jdom2.output.XMLOutputter;import youth.hong.TestDom.Book;public class TestJDom {private static List<Book> bookList = new ArrayList<Book>();public void parseXML() {SAXBuilder saxBuilder = new SAXBuilder();try {Document document = saxBuilder.build(new InputStreamReader(new FileInputStream("src/TestJDom/TestDom.xml"),"utf-8"));/*Document document2 = saxBuilder.build(new FileReader("src/TestJDom/TestDom.xml"));*///没有字符编码,所以最好使⽤上⾯那种Element element = document.getRootElement();int i = 0;// elment.getAttributeValue()返回⼀个list对象List<Element> bookList = element.getChildren();// 遍历每个book的属性for (Element book : bookList) {Book bookEntity = new Book();i++;System.out.println("======================第" + i + "开始==========================");// 已知属性名// System.out.println(book.getAttributeValue("class"));List<Attribute> attrList = book.getAttributes();for (Attribute attribute : attrList) {System.out.println("属性名称:" + attribute.getName() + "----属性值是:" + attribute.getValue());if(attribute.getName().equals("id")) {bookEntity.setId(attribute.getValue());}else if(attribute.getName().equals("class")) {bookEntity.setClassName(attribute.getValue());}}List<Element> children = book.getChildren();for (Element element2 : children) {System.out.println("节点名--" + element2.getName() + "--节点值--" + element2.getValue());if(element2.getName().equals("name")) {bookEntity.setName(element2.getValue());}else if(element2.getName().equals("author")) {bookEntity.setAuthor(element2.getValue());}else if(element2.getName().equals("year")) {bookEntity.setYear(element2.getValue());}}System.out.println("======================第" + i + "结束=========================="); TestJDom.bookList.add(bookEntity);bookEntity = null;}// System.out.println(TestJDom.bookList.size());} catch (JDOMException | IOException e) {e.printStackTrace();}}public void createXML() {//创建⼀个root节点rssElement rss = new Element("rss");//定义version属性rss.setAttribute("version","2.0");//创建documentDocument document = new Document(rss);Element channel = new Element("channel");rss.addContent(channel);Element title = new Element("title");channel.addContent(title);title.setText("<java你好>");//title.addContent(new CDATA("<!--java你好-->"));Format format = Format.getCompactFormat();format.setIndent("");format.setEncoding("gbk");XMLOutputter outputer = new XMLOutputter(format);try {outputer.output(document, new FileOutputStream("src/TestJDom/JDomnews.xml")); } catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static void main(String[] args) {TestJDom jd = new TestJDom();jd.parseXML();jd.createXML();}}2、Jdomnews.xml<?xml version="1.0" encoding="gbk"?><rss version="2.0"><channel><title><java你好></title></channel></rss>三、dom4j解析1、解析与创建package youth.hong.TestDom4J;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.UnsupportedEncodingException;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import org.dom4j.Attribute;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.io.OutputFormat;import org.dom4j.io.SAXReader;import org.dom4j.io.XMLWriter;import youth.hong.TestDom.Book;public class Dom4JTest {private static List<Book> bookList = new ArrayList<Book>();//dom4j解析xml⽂档public void parseXML() {SAXReader reader = new SAXReader();try {Document document = reader.read(new File("src/TestJDom/TestDom.xml"));System.out.println(new File("src/TestJDom/TestDom.xml"));Element bookStore = document.getRootElement();Iterator<Element> it = bookStore.elementIterator();while(it.hasNext()) {System.out.println("===================某本书开始==================");Book bookEntity = new Book();Element book = it.next();List<Attribute> attrList = book.attributes();System.out.println("当前结点下节点的个数(包括空⽩的⽂本节点)" + book.nodeCount());for(Attribute attribute : attrList) {System.out.println("属性名:" + attribute.getName() + "属性值:" + attribute.getValue());if(attribute.getName().equals("id")) {bookEntity.setId(attribute.getValue());}else if(attribute.getName().equals("class")) {bookEntity.setClassName(attribute.getValue());}}Iterator<Element> itt = book.elementIterator();while(itt.hasNext()) {Element childNode = itt.next();System.out.println("节点名:" + childNode.getName() + "节点值:" + childNode.getStringValue());if(childNode.getName().equals("name")) {bookEntity.setName(childNode.getStringValue());}else if(childNode.getName().equals("author")) {bookEntity.setAuthor(childNode.getStringValue());}else if(childNode.getName().equals("year")) {bookEntity.setYear(childNode.getStringValue());}}bookList.add(bookEntity);bookEntity = null;System.out.println("===================某本书结束==================");System.out.println(bookList.size());}} catch (DocumentException e) {e.printStackTrace();}}//⽣成XML⽂档public void createXML() {Document document = DocumentHelper.createDocument();Element rss = document.addElement("rss");rss.addAttribute("version", "2.0");Element channel = rss.addElement("channel");Element title = channel.addElement("title");title.setText("<!--新闻要点-->");Element image = channel.addElement("image");Element imageTitle = image.addElement("title");imageTitle.setText("");Element link = image.addElement("link");link.setText("");Element url = image.addElement("url");url.setText("/img/logo-news.gif");File file = new File("src/TestJDom/news.xml");OutputFormat format = OutputFormat.createPrettyPrint();format.setEncoding("GBK");try {XMLWriter writer = new XMLWriter(new FileOutputStream(file), format);writer.setEscapeText(false);writer.write(document);} catch (UnsupportedEncodingException | FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static void main(String[] args) {Dom4JTest d4j = new Dom4JTest();d4j.parseXML();d4j.createXML();}}2、创建的news.xml<?xml version="1.0" encoding="GBK"?><rss version="2.0"><channel><title><!--新闻要点--></title><image><title></title><link></link><url>/img/logo-news.gif</url></image></channel></rss>四、dom解析1、解析与创建package youth.hong.TestDom;import java.io.File;import java.io.IOException;import java.util.ArrayList;import java.util.List;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import javax.xml.transform.OutputKeys;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.DOMSource;import javax.xml.transform.stream.StreamResult;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import org.xml.sax.SAXException;public class TestDom {private static List<Book> bookSuffle = new ArrayList<Book>();/*** 获取DocumentBuilder对象*/public DocumentBuilder getDocumentBuilder() {DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();DocumentBuilder documentBuilder = null;try {documentBuilder = dbf.newDocumentBuilder();} catch (ParserConfigurationException e) {// TODO Auto-generated catch blocke.printStackTrace();}return documentBuilder;}/*** dom⽅法解析Xml⽂件*/public void domParse() {try {Document document = getDocumentBuilder().parse("src/TestJDom/TestDom.xml"); NodeList bookList = document.getElementsByTagName("book");for(int i = 0; i < bookList.getLength(); i++) {String id = null;String name = null;String author = null;String year = null;//在不知道属性名称的情况下使⽤/*Node book = bookList.item(i);NamedNodeMap attrs = book.getAttributes();for(int j = 0; j < attrs.getLength(); j++) {Node attr = attrs.item(j);System.out.println(attr.getNodeName() + " " + attr.getNodeValue());}*///在知道属性名称的情况下使⽤/*Element book = (Element)bookList.item(i);String id = book.getAttribute("id");String className = book.getAttribute("class");System.out.println(id + " " + className);*/Node book = bookList.item(i);Element bookElement = (Element)book;id = bookElement.getAttribute("id");NodeList childNodes = book.getChildNodes();System.out.println(childNodes.getLength());for(int k = 0; k < childNodes.getLength(); k++) {Node childNode = childNodes.item(k);if(childNode.getNodeType() == Node.ELEMENT_NODE) {String value = childNode.getTextContent();String nodeName = childNode.getNodeName();switch(nodeName) {case "name" : name = value; value = null; break;case "author" : author = value; value = null; break;case "year" : year = value; value = null; break;}//System.out.println(childNode.getNodeName() + " " + childNode.getFirstChild().getNodeValue()); }}bookSuffle.add(new Book(id,name,author,year));//System.out.println();}for(int i = 0; i < bookSuffle.size(); i++) {System.out.println(bookSuffle.get(i));}} catch (SAXException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/*** ⽣成Xml⽂件,要创建多本书可以通过for循环来⽣成,但内容应当定义⼀个book的类去存储内容* @param args*/public void creatXml() {DocumentBuilder documentBuilder = this.getDocumentBuilder();//⽣成documentDocument document = documentBuilder.newDocument();//去掉standalone属性document.setXmlStandalone(true);//创建bookStore节点Element bookStore = document.createElement("bookStore");//创建book节点Element book1 = document.createElement("book");Element book2 = document.createElement("book");Element name1 = document.createElement("name");Element author1 = document.createElement("author");Element year1 = document.createElement("year");Element price1 = document.createElement("price");Element name2 = document.createElement("name");Element author2 = document.createElement("author");Element year2 = document.createElement("year");Element price2 = document.createElement("price");/*//创建⽂本节点Node nameText = document.createTextNode("七龙珠");//添加⽂本节点name.appendChild(nameText);*/name1.setTextContent("⽝夜叉");year1.setTextContent("2008");author1.setTextContent("⾼桥留美⼦");price1.setTextContent("200$");book1.appendChild(name1);book1.appendChild(author1);book1.appendChild(year1);book1.appendChild(price1);//为book节点添加属性idbook1.setAttribute("id", "1");//把book节点加⼊到bookStore节点中bookStore.appendChild(book1);name2.setTextContent("唐⼈街探案");year2.setTextContent("2016");author2.setTextContent("陈思成");price2.setTextContent("VIP会员免费");book2.appendChild(name2);book2.appendChild(author2);book2.appendChild(year2);book2.appendChild(price2);//添加第⼆个bookbookStore.appendChild(book2);//把节点bookStore加⼊到document中document.appendChild(bookStore);//使⽤TransformerFactoryTransformerFactory factory = TransformerFactory.newInstance();try {Transformer transformer = factory.newTransformer();//输⼊节点之间的换⾏transformer.setOutputProperty(OutputKeys.INDENT, "yes");//传⼊document,输出流⽣成xml⽂件transformer.transform(new DOMSource(document), new StreamResult(new File("bookCreate.xml"))); } catch (TransformerConfigurationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (TransformerException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/*** 主程序的⼊⼝* @param args*/public static void main(String[] args) {// TODO Auto-generated method stubTestDom testDom = new TestDom();testDom.domParse();testDom.creatXml();}}2、⽣成的bookCreate.xml<?xml version="1.0" encoding="UTF-8"?><bookStore><book id="1"><name>⽝夜叉</name><author>⾼桥留美⼦</author><year>2008</year><price>200$</price></book><book><name>唐⼈街探案</name><author>陈思成</author><year>2016</year><price>VIP会员免费</price></book></bookStore>。
java解析xml文件四种方式1.介绍1)DOM(JAXP Crimson解析器)DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。
DOM是以层次结构组织的节点或信息片断的集合。
这个层次结构允许开发人员在树中寻找特定信息。
分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。
由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。
DOM以及广义的基于树的处理具有几个优点。
首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。
它还可以在任何时候在树中上下导航,而不是像SAX那样是一次性的处理。
DOM使用起来也要简单得多。
2)SAXSAX处理的优点非常类似于流媒体的优点。
分析能够立即开始,而不是等待所有的数据被处理。
而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。
这对于大型文档来说是个巨大的优点。
事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。
一般来说,SAX 还比它的替代者DOM快许多。
选择DOM还是选择SAX?对于需要自己编写代码来处理XML文档的开发人员来说,选择DOM还是SAX解析模型是一个非常重要的设计决策。
DOM采用建立树形结构的方式访问XML文档,而SAX采用的事件模型。
DOM解析器把XML文档转化为一个包含其内容的树,并可以对树进行遍历。
用DOM解析模型的优点是编程容易,开发人员只需要调用建树的指令,然后利用navigation APIs访问所需的树节点来完成任务。
可以很容易的添加和修改树中的元素。
然而由于使用DOM解析器的时候需要处理整个XML文档,所以对性能和内存的要求比较高,尤其是遇到很大的XML文件的时候。
由于它的遍历能力,DOM解析器常用于XML文档需要频繁的改变的服务中。
SAX解析器采用了基于事件的模型,它在解析XML文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。
java解析xml的⼏种⽅式第⼀种:DOM。
DOM的全称是Document Object Model,也即⽂档对象模型。
在应⽤程序中,基于DOM的XML分析器将⼀个XML⽂档转换成⼀个对象模型的集合(通常称DOM树),应⽤程序正是通过对这个对象模型的操作,来实现对XML⽂档数据的操作。
通过DOM接⼝,应⽤程序可以在任何时候访问XML⽂档中的任何⼀部分数据,因此,这种利⽤DOM接⼝的机制也被称作随机访问机制。
DOM接⼝提供了⼀种通过分层对象模型来访问XML⽂档信息的⽅式,这些分层对象模型依据XML的⽂档结构形成了⼀棵节点树。
⽆论XML ⽂档中所描述的是什么类型的信息,即便是制表数据、项⽬列表或⼀个⽂档,利⽤DOM所⽣成的模型都是节点树的形式。
也就是说,DOM 强制使⽤树模型来访问XML⽂档中的信息。
由于XML本质上就是⼀种分层结构,所以这种描述⽅法是相当有效的。
DOM树所提供的随机访问⽅式给应⽤程序的开发带来了很⼤的灵活性,它可以任意地控制整个XML⽂档中的内容。
然⽽,由于DOM分析器把整个XML⽂档转化成DOM树放在了内存中,因此,当⽂档⽐较⼤或者结构⽐较复杂时,对内存的需求就⽐较⾼。
⽽且,对于结构复杂的树的遍历也是⼀项耗时的操作。
所以,DOM分析器对机器性能的要求⽐较⾼,实现效率不⼗分理想。
不过,由于DOM分析器所采⽤的树结构的思想与XML⽂档的结构相吻合,同时鉴于随机访问所带来的⽅便,因此,DOM分析器还是有很⼴泛的使⽤价值的。
Java代码1. import java.io.File;2.3. import javax.xml.parsers.DocumentBuilder;4. import javax.xml.parsers.DocumentBuilderFactory;5.6. import org.w3c.dom.Document;7. import org.w3c.dom.Element;8. import org.w3c.dom.NodeList;9.10. public class DomTest111. {12. public static void main(String[] args) throws Exception13. {14. // step 1: 获得dom解析器⼯⼚(⼯作的作⽤是⽤于创建具体的解析器)15. DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();16.17. // System.out.println("class name: " + dbf.getClass().getName());18.19. // step 2:获得具体的dom解析器20. DocumentBuilder db = dbf.newDocumentBuilder();21.22. // System.out.println("class name: " + db.getClass().getName());23.24. // step3: 解析⼀个xml⽂档,获得Document对象(根结点)25. Document document = db.parse(new File("candidate.xml"));26.27. NodeList list = document.getElementsByTagName("PERSON");28.29. for(int i = 0; i < list.getLength(); i++)30. {31. Element element = (Element)list.item(i);32.33. String content = element.getElementsByTagName("NAME").item(0).getFirstChild().getNodeValue();34.35. System.out.println("name:" + content);36.37. content = element.getElementsByTagName("ADDRESS").item(0).getFirstChild().getNodeValue();38.39. System.out.println("address:" + content);40.41. content = element.getElementsByTagName("TEL").item(0).getFirstChild().getNodeValue();42.43. System.out.println("tel:" + content);44.45. content = element.getElementsByTagName("FAX").item(0).getFirstChild().getNodeValue();46.47. System.out.println("fax:" + content);48.49. content = element.getElementsByTagName("EMAIL").item(0).getFirstChild().getNodeValue();50.51. System.out.println("email:" + content);52.53. System.out.println("--------------------------------------");54. }55. }56. }import java.io.File;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.NodeList;public class DomTest1{public static void main(String[] args) throws Exception{// step 1: 获得dom解析器⼯⼚(⼯作的作⽤是⽤于创建具体的解析器)DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();// System.out.println("class name: " + dbf.getClass().getName());// step 2:获得具体的dom解析器DocumentBuilder db = dbf.newDocumentBuilder();// System.out.println("class name: " + db.getClass().getName());// step3: 解析⼀个xml⽂档,获得Document对象(根结点)Document document = db.parse(new File("candidate.xml"));NodeList list = document.getElementsByTagName("PERSON");for(int i = 0; i < list.getLength(); i++){Element element = (Element)list.item(i);String content = element.getElementsByTagName("NAME").item(0).getFirstChild().getNodeValue();System.out.println("name:" + content);content = element.getElementsByTagName("ADDRESS").item(0).getFirstChild().getNodeValue();System.out.println("address:" + content);content = element.getElementsByTagName("TEL").item(0).getFirstChild().getNodeValue();System.out.println("tel:" + content);content = element.getElementsByTagName("FAX").item(0).getFirstChild().getNodeValue();System.out.println("fax:" + content);content = element.getElementsByTagName("EMAIL").item(0).getFirstChild().getNodeValue();System.out.println("email:" + content);System.out.println("--------------------------------------");}}}Java代码1. import java.io.File;2.3. import javax.xml.parsers.DocumentBuilder;4. import javax.xml.parsers.DocumentBuilderFactory;5.6. import org.w3c.dom.Attr;7. import ment;8. import org.w3c.dom.Document;9. import org.w3c.dom.Element;10. import dNodeMap;11. import org.w3c.dom.Node;12. import org.w3c.dom.NodeList;13.14. /**15. * 使⽤递归解析给定的任意⼀个xml⽂档并且将其内容输出到命令⾏上16. * @author zhanglong17. *18. */19. public class DomTest320. {21. public static void main(String[] args) throws Exception22. {23. DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();24. DocumentBuilder db = dbf.newDocumentBuilder();25.26. Document doc = db.parse(new File("student.xml"));27. //获得根元素结点28. Element root = doc.getDocumentElement();29.30. parseElement(root);31. }32.33. private static void parseElement(Element element)34. {35. String tagName = element.getNodeName();36.37. NodeList children = element.getChildNodes();38.39. System.out.print("<" + tagName);40.41. //element元素的所有属性所构成的NamedNodeMap对象,需要对其进⾏判断42. NamedNodeMap map = element.getAttributes();43.44. //如果该元素存在属性45. if(null != map)46. {47. for(int i = 0; i < map.getLength(); i++)48. {49. //获得该元素的每⼀个属性50. Attr attr = (Attr)map.item(i);51.52. String attrName = attr.getName();53. String attrValue = attr.getValue();54.55. System.out.print(" " + attrName + "=\"" + attrValue + "\"");56. }57. }58.59. System.out.print(">");60.61. for(int i = 0; i < children.getLength(); i++)62. {63. Node node = children.item(i);64. //获得结点的类型65. short nodeType = node.getNodeType();66.67. if(nodeType == Node.ELEMENT_NODE)68. {69. //是元素,继续递归70. parseElement((Element)node);71. }72. else if(nodeType == Node.TEXT_NODE)73. {74. //递归出⼝75. System.out.print(node.getNodeValue());76. }77. else if(nodeType == MENT_NODE)78. {79. System.out.print("<!--");80.81. Comment comment = (Comment)node;82.83. //注释内容84. String data = comment.getData();85.86. System.out.print(data);87.88. System.out.print("-->");89. }90. }91.92. System.out.print("</" + tagName + ">");93. }94. }import java.io.File;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Attr;import ment;import org.w3c.dom.Document;import org.w3c.dom.Element;import dNodeMap;import org.w3c.dom.Node;import org.w3c.dom.NodeList;/*** 使⽤递归解析给定的任意⼀个xml⽂档并且将其内容输出到命令⾏上* @author zhanglong**/public class DomTest3{public static void main(String[] args) throws Exception{DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();DocumentBuilder db = dbf.newDocumentBuilder();Document doc = db.parse(new File("student.xml"));//获得根元素结点Element root = doc.getDocumentElement();parseElement(root);}private static void parseElement(Element element){String tagName = element.getNodeName();NodeList children = element.getChildNodes();System.out.print("<" + tagName);//element元素的所有属性所构成的NamedNodeMap对象,需要对其进⾏判断 NamedNodeMap map = element.getAttributes();//如果该元素存在属性if(null != map){for(int i = 0; i < map.getLength(); i++){//获得该元素的每⼀个属性Attr attr = (Attr)map.item(i);String attrName = attr.getName();String attrValue = attr.getValue();System.out.print(" " + attrName + "=\"" + attrValue + "\"");}}System.out.print(">");for(int i = 0; i < children.getLength(); i++){Node node = children.item(i);//获得结点的类型short nodeType = node.getNodeType();if(nodeType == Node.ELEMENT_NODE){//是元素,继续递归parseElement((Element)node);}else if(nodeType == Node.TEXT_NODE){//递归出⼝System.out.print(node.getNodeValue());}else if(nodeType == MENT_NODE){System.out.print("<!--");Comment comment = (Comment)node;//注释内容String data = comment.getData();System.out.print(data);System.out.print("-->");}}System.out.print("</" + tagName + ">");}}sax:SAX的全称是Simple APIs for XML,也即XML简单应⽤程序接⼝。
java 解析xml方法在Java中,有许多库可以用于解析XML文档。
其中,DOM和SAX 是最常用的两种。
DOM是一种基于树结构的解析方式,而SAX是一种基于事件的解析方式。
1.DOM解析XMLDOM解析器将整个XML文档读入内存,并将其转换为一个树形结构。
这个树形结构可以使用Document Object Model (DOM) API来访问。
DOM解析器可以很容易地遍历这个树形结构,并提取出需要的元素和属性。
下面是一个使用DOM解析器读取XML文件的示例:```javaDocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(newFile('example.xml'));Element root = document.getDocumentElement();NodeList nodeList = root.getElementsByTagName('book'); for (int i = 0; i < nodeList.getLength(); i++) {Node node = nodeList.item(i);if (node.getNodeType() == Node.ELEMENT_NODE) {Element element = (Element) node;String title =element.getElementsByTagName('title').item(0).getTextConten t();String author =element.getElementsByTagName('author').item(0).getTextConte nt();System.out.println('Title: ' + title + ', Author: ' + author);}}```在这个例子中,我们使用了DocumentBuilderFactory和DocumentBuilder类来创建一个DOM解析器。
multipartfile java解析文件类型在 Java 中,使用 MultipartFile 对象处理上传的文件,你可以通过以下步骤解析文件类型:获取文件名:String fileName = multipartFile.getOriginalFilename();获取文件的字节数组:byte[] fileBytes = multipartFile.getBytes();使用文件字节数组检查文件类型:你可以使用一些库或方法来检查文件的类型。
一个常见的库是Apache Tika,它能够根据文件内容检测文件的 MIME 类型。
以下是一个使用 Tika 的示例:import org.apache.tika.Tika;Tika tika = new Tika();String mimeType = tika.detect(fileBytes);请确保你的项目中包含了Apache Tika 的依赖。
在Maven 项目中,你可以添加以下依赖:<dependency><groupId>org.apache.tika</groupId><artifactId>tika-core</artifactId><version>1.27</version> <!-- 使用最新版本 --></dependency>根据 MIME 类型或文件后缀名判断文件类型:你可以根据获得的MIME 类型或文件名后缀进行文件类型的判断。
一些库(例如 Apache Commons IO)提供了方法来提取文件后缀名。
import mons.io.FilenameUtils;String fileExtension = FilenameUtils.getExtension(fileName);然后,你可以根据文件后缀名或 MIME 类型执行相应的操作。
SVG工作原理SVG(可缩放矢量图形)是一种基于XML的图像格式,用于描述二维图形和图像。
它具有许多优点,如可缩放性、高清晰度、小文件大小和可编辑性。
本文将详细介绍SVG的工作原理。
SVG的工作原理可以分为两个主要步骤:解析和渲染。
1. 解析:SVG图像首先需要被解析器解析,解析器可以是浏览器或其他SVG阅读器。
解析器会读取SVG文件中的XML代码,并将其转换为内部表示形式,以便进一步处理。
解析过程中,解析器会按照XML的语法规则逐行读取SVG文件。
它会识别标签、属性和值,并将它们转换为可理解的数据结构。
解析器还会处理命名空间、实体引用和其他XML特性。
2. 渲染:一旦SVG文件被解析器解析,接下来就是渲染阶段。
在渲染阶段,解析器会使用解析后的数据结构来构建最终的图像。
渲染过程中,解析器会根据SVG文件中的图形元素和属性来创建相应的图形对象。
这些图形对象可以是线条、矩形、圆形、文本等。
解析器还会处理图形对象之间的关系,如层次结构、变换和样式。
一旦图形对象被创建,解析器会根据它们的属性和样式来计算它们在屏幕上的位置和外观。
这包括计算位置、大小、颜色、填充、描边等。
最终,解析器会将计算结果传递给渲染引擎,以便将图像呈现在屏幕上。
渲染引擎会将图像的绘制命令转换为底层图形库或硬件的操作,以便在屏幕上绘制图像。
这些操作可以是绘制线条、填充颜色、应用滤镜等。
最终,图像将以像素的形式显示在屏幕上,用户就可以看到最终的SVG图像了。
总结:SVG的工作原理包括解析和渲染两个主要步骤。
解析器会将SVG文件转换为内部数据结构,然后根据数据结构创建图形对象,并计算它们在屏幕上的位置和外观。
最后,渲染引擎将图像绘制在屏幕上,用户可以看到最终的SVG图像。
SVG的工作原理是基于XML的,因此它具有良好的可扩展性和可编辑性。
开发人员可以使用文本编辑器或专门的SVG编辑器来创建和修改SVG文件。
同时,SVG也支持脚本语言(如JavaScript),可以实现交互性和动画效果。
Java 解解解解解解解(解解解)解解解解解本文主要介绍Java中解析获取文件扩展名(后缀名)的几种方法。
1、使用FilenameUtils.getExtension来获取扩展名maven配置:<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.4</version></dependency>String ext1 = FilenameUtils.getExtension("/path/to/file/foo.txt"); //returns "txt" String ext2 = FilenameUtils.getExtension("bar.exe"); //returns "exe"文档:...2、通过使用lastIndexOf和substring方法来得到扩展名String extension = "";int i = stIndexOf('.');if (i > 0) {extension = fileName.substring(i+1);}或String extension = "";int i = stIndexOf('.');int p = Math.max(stIndexOf('/'), stIndexOf('\\'));if (i > p) {extension = fileName.substring(i+1);}3、使用Guava库的Files工具类获取扩展名maven配置:<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>17.0</version></dependency>String path = "c:/path/to/file/foo.txt";String ext = Files.getFileExtension(path);System.out.println(ext); //prints txt文档:...4、Android上可以使用的方法String ext = android.webkit.MimeTypeMap.getFileExtensionFromUrl(file.getName());5、经过测试的getExtension获取扩展名方法public static String getExtension(String fileName) {char ch;int len;if(fileName==null ||(len = fileName.length())==0 ||(ch = fileName.charAt(len-1))=='/' || ch=='\\' || //in the case of a directorych=='.' ) //in the case of . or ..return "";int dotInd = stIndexOf('.'),sepInd = Math.max(stIndexOf('/'), stIndexOf('\\'));if( dotInd<=sepInd )return "";elsereturn fileName.substring(dotInd+1).toLowerCase();}测试用例@Testpublic void testGetExtension() {assertEquals("", getExtension("C"));assertEquals("ext", getExtension("C.ext"));assertEquals("ext", getExtension("A/B/C.ext"));assertEquals("", getExtension("A/B/C.ext/"));assertEquals("", getExtension("A/B/C.ext/.."));assertEquals("bin", getExtension("A/B/C.bin"));assertEquals("hidden", getExtension(".hidden"));assertEquals("dsstore", getExtension("/user/home/.dsstore"));assertEquals("", getExtension(".strange."));assertEquals("3", getExtension("1.2.3"));assertEquals("exe", getExtension("C:\\Program Files (x86)\\java\\bin\\javaw.exe")); }6、使用split方法来获取后缀名String[] split = fullFileName.split("\\.");String ext = split[split.length - 1];。
使用Batik创建SVG应用程序
Batik工具集提供的JSVGCanvas模块是一个swing 组件,用于显示静态或动态SVG文档。
通过JSVGCanvas模块,开发人员可以轻松显示SVG文档(通过URI 地址或DOM树)并对其进行操作,例如旋转、缩放、摇动、选择文本或激活超级链接等。
首先介绍如何创建JSVGCanvas并集成到一个swing应用程序中。
接下来解释如何完成与SVG画布相关的常用功能,例如如何跟踪SVG文档渲染时发生的所有事件,以及如何通过Java TM语言操作SVG文档。
创建JSVGCanvas
JSVGCanvas是一个swing 组件并遵循swing设计规则(Swing design rule[4])。
这意味着组件不是线程安全的,而且所有操作应当参照swing教程描述使用。
JSVGCanvas也是一个JavaBean组件,因此可以在可视化应用程序开发工具中使用。
下例中演示了如何轻松创建和使用JSVGCanvas组件(见图3)。
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
import org.apache.batik.swing.JSVGCanvas;
import org.apache.batik.swing.gvt.GVTTreeRendererAdapter;
import org.apache.batik.swing.gvt.GVTTreeRendererEvent;
import org.apache.batik.swing.svg.SVGDocumentLoaderAdapter;
import org.apache.batik.swing.svg.SVGDocumentLoaderEvent;
import org.apache.batik.swing.svg.GVTTreeBuilderAdapter;
import org.apache.batik.swing.svg.GVTTreeBuilderEvent;
public class SVGApplication {
public static void main(String[] args) {
JFrame f = new JFrame("Batik");
SVGApplication app = new SVGApplication(f);
f.getContentPane().add(app.createComponents());
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
f.setSize(400, 400);
f.setVisible(true);
}
JFrame frame;
JButton button = new JButton("Load...");
JLabel label = new JLabel();
JSVGCanvas svgCanvas = new JSVGCanvas();
public SVGApplication(JFrame f) {
frame = f;
}
public JComponent createComponents() {
final JPanel panel = new JPanel(new BorderLayout());
JPanel p = new JPanel(new FlowLayout(FlowLayout.LEFT));
p.add(button);
p.add(label);
panel.add(p, BorderLayout.NORTH);
panel.add(svgCanvas, BorderLayout.CENTER);
// Set the button action.
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
JFileChooser fc = new JFileChooser(".");
int choice = fc.showOpenDialog(panel);
if (choice ==
JFileChooser.APPROVE_OPTION) {
File f = fc.getSelectedFile();
try {
svgCanvas.setURI(f.toU RL().toString());
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
});
// Set the JSVGCanvas listeners.
svgCanvas.addSVGDocumentLoaderListener(new SVGDocumentLoaderAdapter() {
public void
documentLoadingStarted(SVGDocumentLoaderEvent e) {
label.setText("Document Loading...");
}
public void
documentLoadingCompleted(SVGDocumentLoaderEvent e) {
label.setText("Document Loaded.");
}
});
svgCanvas.addGVTTreeBuilderListener(new GVTTreeBuilderAdapter() {
public void gvtBuildStarted(GVTTreeBuilderEvent e) {
label.setText("Build Started...");
}
public void
gvtBuildCompleted(GVTTreeBuilderEvent e) {
label.setText("Build Done.");
frame.pack();
}
});
svgCanvas.addGVTTreeRendererListener(new GVTTreeRendererAdapter() {
public void
gvtRenderingPrepare(GVTTreeRendererEvent e) {
label.setText("Rendering Started...");
}
public void
gvtRenderingCompleted(GVTTreeRendererEvent e) {
label.setText("");
}
});
return panel;
}
}。