xml
SAX解析xml文件
<?xml version="1.0" encoding="UTF-8"?>
<书架>
<书>
<书名>书名1</书名>
<作者>作者1</作者>
<售价>2</售价>
</书>
<书>
<书名>书名2</书名>
<作者>作者2</作者>
<售价>10</售价>
</书>
</书架>
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
public class SaxDemo1 {
public static void main(String[] args) throws Exception {
// 得到创建解析器的工厂
SAXParserFactory spf = SAXParserFactory.newInstance();
// 得到解析器
SAXParser parser = spf.newSAXParser();
// 得到读取器
XMLReader reader = parser.getXMLReader();
// 给读取器注册内容处理器(ContentHandler)
reader.setContentHandler(new MyContentHandler());
// 解析文档
reader.parse("src/book.xml");
}
}
//打印第二个作者名字
class MyContentHandler extends DefaultHandler {
private boolean isAuthor = false;//是不是作者
private int index = 1;//索引
public void startElement(String uri, String localName, String qName,
Attributes atts) throws SAXException {
if("作者".equals(qName)){
isAuthor = true;
}
}
public void endElement(String uri, String localName, String qName)
throws SAXException {
if("作者".equals(qName)){
index++;
}
isAuthor = false;
}
public void characters(char[] ch, int start, int length)
throws SAXException {
if(index==2&&isAuthor){//当if条件满足就执行
System.out.println(new String(ch,start,length));
}
}
}
DOM4J解析XML文档
<?xml version="1.0" encoding="UTF-8"?>
<State Code="37" Name="山东" description="省会" GDP="54684亿">
<City>
<Name>济南</Name>
<Region>历下区</Region>
</City>
<City>青岛</City>
<City>东营</City>
<City>泰安</City>
<City>潍坊</City>
</State>
建立dom4j工具包提供获得根元素静态方法
import java.io.FileOutputStream;
import org.dom4j.Document;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class Dom4JUtil {
public static Document getDocument() throws Exception{
SAXReader sa = new SAXReader();
Document doc = sa.read("src/LocList.xml");
return doc;
}
public static void write2xml(Document doc)throws Exception{
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");//默认就是UTF-8
XMLWriter writer = new XMLWriter(new FileOutputStream("src/LocList.xml"), format);
writer.write(doc);
writer.close();
}
}
利用dom4J解析前面的xml文件
public class Dom4JDemo {
public void main(String[] args) throws Exception{
Document doc = Dom4JUtil.getDocument();
Element root = doc.getRootElement();//得到根元素
Element firstCity = root.element("City");//多个只返回第一个
System.out.println(firstCity.elementText("Name"));
List<Element> es = root.elements();
Element e = es.get(3);//打印3号元素主体内容
System.out.println(e.getText());
}
XML中引入Schema约束
查看Schema的文档,找到targetNamespace的取值,在xml中用xmlns关键字声明该名称空间。”itheima”就是给名称空间取了一个短名称。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" //xmlns为关键字
targetNamespace="http://www.xxxxx.com" elementFormDefault="qualified">
<xs:element name='书架'>
<xs:complexType>
<xs:sequence maxOccurs='unbounded'>
<xs:element name='书'>
<xs:complexType>
<xs:sequence>
<xs:element name='书名' type='xs:string' />
<xs:element name='作者' type='xs:string' />
<xs:element name='售价' type='xs:string' />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
引入xml文档中
<?xml version="1.0" encoding="UTF-8"?>
<itheima:书架 xmlns:itheima="http://www.xxxxx.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
//schemaLocation此属性有两个值。第一个值是需要使用的命名空间。第二个值是供命名空间使用的 XML schema 的位置,两者之间用空格分隔。
xsi:schemaLocation="http://www.xxxxx.com book.xsd">
<itheima:书>
<itheima:书名>书名1</itheima:书名>
<itheima:作者>作者1</itheima:作者>
<itheima:售价>20</itheima:售价>
</itheima:书>
</itheima:书架>