XML(Extensible Markup Language 可扩展标记语言),XML是一个以文本来描述数据的文档。
(1) 充当显示数据(以XML充当显示层)
(2) 存储数据(存储层)的功能
(3)以XML描述数据,并在联系服务器与系统的其余部分之间传递。
从某种角度讲:XML是数据封装和消息传递技术。
- SAX的了解
-
SAX *** 作
继承DefaultHandler
package XML_Example; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import java.util.ArrayList; import java.util.List; public class personHandler extends DefaultHandler { private List<person> persons=null; private person p; //当前正在解析的person对象 private String tag; //用于记录当前正在解析的标签 public List<person> getPersons() { return persons; } //开始解析文档时调用 @Override public void startDocument() throws SAXException { super.startDocument(); //初始化集合 persons=new ArrayList<>(); System.out.println("开始解析》》》》》》"); } //XML解析完结束 @Override public void endDocument() throws SAXException { super.endDocument(); System.out.println("解析结束??????"); } //解析开始元素时调用 //uri 命名空间 //localName 不带前缀的标签名 //qName 带前缀的标签名 //attributes 当前标签的属性集合 @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes); if ("person".equals(qName)) { p=new person(); String personid=attributes.getValue("personid"); p.setPersonid(personid); } tag=qName; } //解析结束元素时调用 @Override public void endElement(String uri, String localName, String qName) throws SAXException { super.endElement(uri, localName, qName); if ("person".equals(qName)){ persons.add(p); } tag=null; } //解析文本内容时调用 @Override public void characters(char[] ch, int start, int length) throws SAXException { super.characters(ch, start, length); if (tag!=null){ if ("name".equals(tag)){ p.setName(new String(ch,start,length)); } else if ("address".equals(tag)) { p.setAddress(new String(ch,start,length)); } else if ("tel".equals(tag)) { p.setTel(new String(ch,start,length)); } else if ("fax".equals(tag)){ p.setFax(new String(ch,start,length)); } else if ("email".equals(tag)) { p.setEmail(new String(ch,start,length)); } } } }
*** 作XML
public void saxParseXML() throws ParserConfigurationException, SAXException, IOException { //创建一个sax解析器工厂对象 SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); //通过工厂对象创建sax解析器 SAXParser saxParser = saxParserFactory.newSAXParser(); //创建一个数据处理器(需要自己写) personHandler personHandler = new personHandler(); //开始解析 InputStream is = Thread.currentThread() .getContextClassLoader().getResourceAsStream("XML_Example/people.xml"); saxParser.parse(is,personHandler); List<person> persons = personHandler.getPersons(); for (person p:persons) { System.out.println(p); } }
-
SAX解析的特点
1.基于事件驱动
2.顺序读取,速度快
3.不能任意读取节点(灵活性低)
4.解析时占用的内存小
5.SAX更适用于在性能更高的设备上使用(Android开水中)
-
DOM:Document Object Model(文档对象模型)
-
DOM的特性:
定义一组java接口,基于对象,与语言和平台无关将XML文档表示为树,在内存中解析和存储XML文档,允许随机访问文档的不同部分。
-
DOM解析XML
DOM的优点:由于树在内存中是持久的,因此可以修改后更新,它还可以在任何时候在树中上下导航,API使用起来也较简单。
-
DOM解析的特点
1.基于树型结构,通过解析器一次性将文档加载到内存中,所以会比较占内存,可以随机访问,更灵活,更适合在web开发中使用。
-
DOM的 *** 作实例
public void DomParseXML() throws ParserConfigurationException, IOException, SAXException { //创建一个DOM解析器工厂对象 DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); //通过工厂对象创建解析器对象 DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); //解析文档(将所有东西读到内存) InputStream is = Thread.currentThread().getContextClassLoader() .getResourceAsStream("XML_Example/people.xml"); //此代码完成后,整个XML文档1已经被加载到内存中,以树状形式存储 Document doc = documentBuilder.parse(is); //从内存中读取数据 //获取结点名称为person的所有结点,返回结点集合 NodeList person1 = doc.getElementsByTagName("person"); ArrayList<person> persons = new ArrayList<>(); person p=null; for (int i = 0; i < person1.getLength(); i++) { Node item = person1.item(i); p=new person(); //获取节点的属性值 String personid = item.getAttributes().getNamedItem("personid").getNodeValue(); p.setPersonid(personid); //获取当前节点的所有子节点 NodeList childNodes = item.getChildNodes(); for (int j = 0; j < childNodes.getLength(); j++) { Node item1 = childNodes.item(j); String nodeName = item1.getNodeName(); if ("name".equals(nodeName)){ p.setName(item1.getFirstChild().getNodeValue()); }else if("address".equals(nodeName)){ p.setAddress(item1.getFirstChild().getNodeValue()); }else if ("tel".equals(nodeName)){ p.setTel(item1.getFirstChild().getNodeValue()); }else if ("fax".equals(nodeName)){ p.setFax(item1.getFirstChild().getNodeValue()); }else if ("email".equals(nodeName)){ p.setEmail(item1.getFirstChild().getNodeValue()); } } persons.add(p); } System.out.println("打印结果:"); for (person a:persons) { System.out.println(a); } // //第二种方式 // System.out.println(Arrays.toString(persons.toArray())); }
public void xmlEnCoder() throws FileNotFoundException {
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("test.xml"));
XMLEncoder xmlEncoder = new XMLEncoder(bos);
person p=new person();
p.setPersonid("121212");
p.setAddress("b北京");
p.setName("小明");
p.setEmail("[email protected]");
p.setFax("132132");
p.setTel("18251212");
xmlEncoder.writeObject(p);
xmlEncoder.close();
System.out.println("完成");
}
XMLDecoder实例
public void xmlDeCoder() throws FileNotFoundException {
BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("test.xml"));
XMLDecoder xmlDecoder = new XMLDecoder(bufferedInputStream);
person o =(person) xmlDecoder.readObject();
System.out.println(o);
}
实例中的XML和person类
package XML_Example;
public class person {
private String personid;
private String name;
private String address;
private String tel;
private String fax;
private String email;
public String getPersonid() {
return personid;
}
public void setPersonid(String personid) {
this.personid = personid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getFax() {
return fax;
}
public void setFax(String fax) {
this.fax = fax;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "person{" +
"personid='" + personid + '\'' +
", name='" + name + '\'' +
", address='" + address + '\'' +
", tel='" + tel + '\'' +
", fax='" + fax + '\'' +
", email='" + email + '\'' +
'}';
}
}
JSON了解
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)