读写XML

XML是一种可扩展标记语言

下面是一个完整的XML文件(也是下文介绍读写XML的样本):

[html] view
plain
copy

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <poem author="William Carlos Williams" title="The Great Figure">
  3. <line>Among the rain</line>
  4. <line>and ligths</line>
  5. <line>I saw the figure 5</line>
  6. <line>in gold</line>
  7. <line>on a red</line>
  8. <line>fire truck</line>
  9. <line>moving</line>
  10. <line>tense</line>
  11. <line>unheeded</line>
  12. <line>to gong clangs</line>
  13. <line>siren howls</line>
  14. <line>and wheels rumbling</line>
  15. <line>through the dark city</line>
  16. </poem>

一、写XML

本文介绍两种方式:使用DOM开发包来写XML文件和用String对象的方式

将Poem类作为数据源,提供需要转换成XML的内容:

[java] view
plain
copy

  1. class Poem {
  2. private static String title = "The Great Figure";
  3. private static String author = "William Carlos Williams";
  4. private static ArrayList<String> lines = new ArrayList<String>();
  5. static {
  6. lines.add("Among the rain");
  7. lines.add("and ligths");
  8. lines.add("I saw the figure 5");
  9. lines.add("in gold");
  10. lines.add("on a red");
  11. lines.add("fire truck");
  12. lines.add("moving");
  13. lines.add("tense");
  14. lines.add("unheeded");
  15. lines.add("to gong clangs");
  16. lines.add("siren howls");
  17. lines.add("and wheels rumbling");
  18. lines.add("through the dark city");
  19. }
  20. public static String getTitle() {
  21. return title;
  22. }
  23. public static String getAuthor() {
  24. return author;
  25. }
  26. public static ArrayList<String> getLines() {
  27. return lines;
  28. }
  29. }

1、用DOM写XML文件

流程:

(1)创建一个空的Document对象(最顶层的DOM对象,包含了创建XML所需要的其他一切)。

(2)创建元素和属性,把元素和属性加到Document对象中。

(3)把Document对象的内容转换成String对象。

(4)把String对象写到目标文件里去。

[java] view
plain
copy

  1. import java.util.ArrayList;
  2. import java.io.*;
  3. import javax.xml.parsers.*;
  4. import javax.xml.transform.*;
  5. import javax.xml.transform.dom.DOMSource;
  6. import javax.xml.transform.stream.StreamResult;
  7. import org.w3c.dom.*;
  8. public class XmlTest {
  9. public static void main(String[] args) {
  10. Document doc = createXMLContent1(); // 创建空文档
  11. createElements(doc); // 创建XML
  12. String xmlContent = createXMLString(doc);// 创建字符串以表示XML
  13. writeXMLToFile1(xmlContent);
  14. }
  15. /*********** 用DOM写XML文件 ***********/
  16. private static Document createXMLContent1() {
  17. Document doc = null;
  18. try {
  19. // 使应用程序能够从XML文档获取生成 DOM 对象树的解析器
  20. DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
  21. DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
  22. doc = docBuilder.newDocument();
  23. // 作为 XML 声明 的一部分指定此文档是否是单独的的属性。未指定时,此属性为 false。
  24. doc.setXmlStandalone(true);
  25. } catch (ParserConfigurationException pce) {
  26. System.out.println("Couldn‘t create a DocumentBuilder");
  27. System.exit(1);
  28. }
  29. return doc;
  30. }
  31. private static void createElements(Document doc) {
  32. // 创建根元素
  33. Element poem = doc.createElement("poem");
  34. poem.setAttribute("title", Poem.getTitle());
  35. poem.setAttribute("author", Poem.getAuthor());
  36. // 把根元素加到文档里去
  37. doc.appendChild(poem);
  38. // 创建子元素
  39. for (String lineIn : Poem.getLines()) {
  40. Element line = doc.createElement("line");
  41. Text lineText = doc.createTextNode(lineIn);
  42. line.appendChild(lineText);
  43. // 把每个元素加到根元素里去
  44. poem.appendChild(line);
  45. }
  46. }
  47. private static String createXMLString(Document doc) {
  48. // 将DOM转换成字符串
  49. Transformer transformer = null;
  50. StringWriter stringWriter = new StringWriter();
  51. try {
  52. TransformerFactory transformerFactory = TransformerFactory.newInstance();
  53. transformer = transformerFactory.newTransformer();
  54. // 是否应输出 XML 声明
  55. transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
  56. // 是否以XML格式自动换行
  57. transformer.setOutputProperty(OutputKeys.INDENT, "yes");
  58. // 创建字符串以包含XML
  59. stringWriter = new StringWriter();
  60. StreamResult result = new StreamResult(stringWriter);// 充当转换结果的持有者
  61. DOMSource source = new DOMSource(doc);
  62. transformer.transform(source, result);
  63. } catch (TransformerConfigurationException e) {
  64. System.out.println("Couldn‘t create a Transformer");
  65. System.exit(1);
  66. } catch (TransformerException e) {
  67. System.out.println("Couldn‘t transforme DOM to a String");
  68. System.exit(1);
  69. }
  70. return stringWriter.toString();
  71. }
  72. private static void writeXMLToFile1(String xmlContent) {
  73. String fileName = "E:\\test\\domoutput.xml";
  74. try {
  75. File domOutput = new File(fileName);
  76. FileOutputStream domOutputStream = new FileOutputStream(domOutput);
  77. domOutputStream.write(xmlContent.getBytes());
  78. domOutputStream.close();
  79. System.out.println(fileName + " was successfully written");
  80. } catch (FileNotFoundException e) {
  81. System.out.println("Couldn‘t find a file called" + fileName);
  82. System.exit(1);
  83. } catch (IOException e) {
  84. System.out.println("Couldn‘t write a file called" + fileName);
  85. System.exit(1);
  86. }
  87. }

2、用String写XML文件

这种方法就比较简单,就是直接用字符串把整个XML文件描述出来,然后保存文件。

二、读取XML文件

两种方式:用DOM读取XML文件和用SAX方式。一般DOM处理内容比较小的XML文件,而SAX可以处理任意大小的XML文件。

1、用DOM读取XML文件

[java] view
plain
copy

  1. public class XmlTest {
  2. public static void main(String[] args) {
  3. String fileName = "E:\\test\\domoutput.xml";
  4. writeFileContentsToConsole(fileName);
  5. }
  6. /*********** 用DOM读取XML文件 ***********/
  7. private static void writeFileContentsToConsole(String fileName) {
  8. Document doc = createDocument(fileName);
  9. Element root = doc.getDocumentElement();// 获取根元素
  10. StringBuilder sb = new StringBuilder();
  11. sb.append("The root element is named:\"" + root.getNodeName() + "\"");
  12. sb.append("and has the following attributes: ");
  13. NamedNodeMap attributes = root.getAttributes();
  14. for (int i = 0; i < attributes.getLength(); i++) {
  15. Node thisAttribute = attributes.item(i);
  16. sb.append(thisAttribute.getNodeName());
  17. sb.append("(\"" + thisAttribute.getNodeValue() + "\")");
  18. if (i < attributes.getLength() - 1) {
  19. sb.append(",");
  20. }
  21. }
  22. System.out.println(sb);// 根元素的描述信息
  23. NodeList nodes = doc.getElementsByTagName("line");
  24. for (int i = 0; i < nodes.getLength(); i++) {
  25. Element element = (Element) nodes.item(i);
  26. System.out.println("Found an element named \""
  27. + element.getTagName() + "\""
  28. + "With the following content: \""
  29. + element.getTextContent() + "\"");
  30. }
  31. }
  32. private static Document createDocument(String fileName) {// 从文件创建DOM的Document对象
  33. Document doc = null;
  34. try {
  35. File xmlFile = new File(fileName);
  36. DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
  37. DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
  38. doc = docBuilder.parse(xmlFile);// 解析xml文件加载为dom文档
  39. doc.setXmlStandalone(true);
  40. } catch (IOException e) {
  41. e.printStackTrace();
  42. } catch (SAXException e) {
  43. e.printStackTrace();
  44. } catch (ParserConfigurationException e) {
  45. e.printStackTrace();
  46. }
  47. return doc;
  48. }
  49. }/*
  50. * Output:
  51. * The root element is named:"poem"and has the following attributes: author("William Carlos Williams"),title("The Great Figure")
  52. * Found an element named "line"With the following content: "Among the rain"
  53. * Found an element named "line"With the following content: "and ligths"
  54. * ... ...
  55. */// :~

2、用SAX读取XML文件

SAX是使用ContentHandler接口来公开解析事件,而且SAX包提供了一个默认实现类DefaultHandler,它的默认行为就是什么都不做。下面就通过XMLToConsoleHandler类来覆盖其中的一些方法,来捕获XML文件的内容。

[java] view
plain
copy

  1. import org.w3c.dom.CharacterData;
  2. import org.xml.sax.SAXException;
  3. import org.xml.sax.helpers.DefaultHandler;
  4. public class XmlTest {
  5. public static void main(String[] args) {
  6. String fileName = "E:\\test\\domoutput.xml";
  7. getFileContents(fileName);
  8. }
  9. private static void getFileContents(String fileName) {
  10. try {
  11. XMLToConsoleHandler handler = new XMLToConsoleHandler();
  12. SAXParserFactory factory = SAXParserFactory.newInstance();
  13. SAXParser saxParser = factory.newSAXParser();
  14. saxParser.parse(fileName, handler);
  15. } catch (IOException e) {
  16. e.printStackTrace();
  17. } catch (ParserConfigurationException e) {
  18. e.printStackTrace();
  19. } catch (SAXException e) {
  20. e.printStackTrace();
  21. }
  22. }
  23. }
  24. /***********  用SAX读取XML文件   ***********/
  25. class XMLToConsoleHandler extends DefaultHandler {
  26. public void characters(char[] content, int start, int length)
  27. throws SAXException { // 处理元素的真正内容
  28. System.out.println("Found content: " + new String(content, start, length));
  29. }
  30. public void endElement(String arg0, String localName, String qName)throws SAXException {
  31. System.out.println("Found the end of an element named \"" + qName + "\"");
  32. }
  33. public void startElement(String uri, String localName, String qName,
  34. Attributes attributes) throws SAXException {
  35. StringBuilder sb = new StringBuilder();
  36. sb.append("Found the start of an element named \"" + qName + "\"");
  37. if (attributes != null && attributes.getLength() > 0) {
  38. sb.append(" with attributes named ");
  39. for (int i = 0; i < attributes.getLength(); i++) {
  40. String attributeName = attributes.getLocalName(i);
  41. String attributeValue = attributes.getValue(i);
  42. sb.append("\"" + attributeName + "\"");
  43. sb.append(" (value = ");
  44. sb.append("\"" + attributeValue + "\"");
  45. sb.append(")");
  46. if (i < attributes.getLength() - 1) {
  47. sb.append(",");
  48. }
  49. }
  50. }
  51. System.out.println(sb.toString());
  52. }
  53. }

读写XML,布布扣,bubuko.com

时间: 2024-10-06 22:16:05

读写XML的相关文章

在.net中序列化读写xml方法的总结

在.net中序列化读写xml方法的总结 阅读目录 开始 最简单的使用XML的方法 类型定义与XML结构的映射 使用 XmlElement 使用 XmlAttribute 使用 InnerText 重命名节点名称 列表和数组的序列化 列表和数组的做为数据成员的序列化 类型继承与反序列化 反序列化的实战演练 反序列化的使用总结 排除不需要序列化的成员 强制指定成员的序列化顺序 自定义序列化行为 序列化去掉XML命名空间及声明头 XML的使用建议 XML是一种很常见的数据保存方式,我经常用它来保存一些

使用dom4j 读写xml文件

dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的.dom4j是一个十分优秀的JavaXML API,具有性能优异.功能强大和极其易使用的特点,同时它也是一个开放源代码的软件. String fileName="D:\\version.xml"; File inputXML=new File(fileName); //使用 SAXReader 解析 XML 文档 version.xml SAXReader saxReader=new SAXReader();

C#读写xml文件

c#读写xml文件已知有一个XML文件(bookstore.xml)如下: Code<?xml version="1.0" encoding="gb2312"?><bookstore> <book genre="fantasy" ISBN="2-3631-4"> <title>Oberon's Legacy</title> <author>Corets,

iOS 读写xml文件

//*********写入文件,传入要保存的信息*********//保存xml -(void) saveXml:(NSString *)data { //创建文件管理器 NSFileManager *fileManager = [NSFileManager defaultManager ]; //获取路径 //参数NSDocumentDirectory要获取那种路径 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentD

C#_在.net中序列化读写xml方法的总结

阅读目录 开始 最简单的使用XML的方法 类型定义与XML结构的映射 使用 XmlElement 使用 XmlAttribute 使用 InnerText 重命名节点名称 列表和数组的序列化 列表和数组的做为数据成员的序列化 类型继承与反序列化 反序列化的实战演练 反序列化的使用总结 排除不需要序列化的成员 强制指定成员的序列化顺序 自定义序列化行为 序列化去掉XML命名空间及声明头 XML的使用建议 XML是一种很常见的数据保存方式,我经常用它来保存一些数据,或者是一些配置参数. 使用C#,我

JAVA学习笔记 -- 读写XML

XML是一种可扩展标记语言 以下是一个完整的XML文件(也是下文介绍读写XML的样本): <? xml version="1.0" encoding="UTF-8"? > <poem author="William Carlos Williams" title="The Great Figure"> <line>Among the rain</line> <line>

.Net那点事儿系列:C#操作Xml:通过XmlDocument读写Xml文档

什么是Xml? Xml是扩展标记语言的简写,是一种开发的文本格式.关于它的更多情况可以通过w3组织了解http://www.w3.org/TR/1998/REC-xml-19980210.如果你不知道它,那你就out太多了. .Net处理Xml相关随笔 1.通过XmlDocument读写Xml文档2.通过XmlWriter和XmlReader读写Xml文档3.通过LINK to Xml存取XML4.通过XmlScheme定义固定格式xml文档5.Xml序列化或者反序列化类6.通过XPath查找X

JAXB方式读写XML文件

import java.io.File; import java.util.ArrayList; import java.util.List; import javax.xml.bind.JAXB; import org.apache.log4j.Logger; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; import cn.com.starit.ts.nms.collec

PHP读写XML文件的四种方法

PHP对XML文件进行读写操作的方法一共有四种,分别是:字符串方式直接读写.DOMDocument读写. XMLWrite写和XMLReader读.SimpleXML读写,本文将依次对这四种方法进行介绍. 介绍之前首先对本文例子使用的数据和文件进行说明.本文写XML文件的例子都是从MySQL中读取数据然后 写入到XML文件中,读XML文件的例子都是从XML文件中读取数据后组装成数组的格式,数组中每个元素对应数 据库中的一条记录. MySQL中的数据: XML文件: 1 2 3 4 5 6 7 8