java api支持三种操作xml的方式
DOM 文档对象模型,目前支持Document Object Model Level 3,包org.w3c.dom
SAX Simple API for XML,包org.xml.sax
StAX 包javax.xml.stream,其中这个包是从1.6开始的
DOM
public class DomTest {
public static void main(String[] args) {
final String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<person>" +
"<name>bruce lee</name>" +
"<age>28</age>" +
"</person>";
DOM(xml);
}
// DOM解析方式
private static void DOM(final String xml) {
DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();
InputStream input;
try {
DocumentBuilder p = f.newDocumentBuilder();
input = new ByteArrayInputStream(xml.getBytes());
Document doc = p.parse(input);
NodeList nl = doc.getElementsByTagName("person");
for (int i=0;i<nl.getLength();i++){
System.out.println(doc.getElementsByTagName("name").item(i).getFirstChild().getNodeValue());
System.out.println(doc.getElementsByTagName("age").item(i).getFirstChild().getNodeValue());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
SAX
public class SaxTest extends DefaultHandler{
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
final String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<person>" +
"<name>brucelee</name>" +
"<age>28</age>" +
"</person>";
SAX(xml);
}
// sax解析方式
private static void SAX(final String xml) throws ParserConfigurationException, SAXException, IOException {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
SaxTest handler = new SaxTest();
parser.parse("e://web.xml", handler);
}
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
System.out.println("start node name:" + qName);
}
public void endElement(String uri, String localName, String qName) throws SAXException {
System.out.println("end node name:" + qName);
}
public void characters(char ch[], int start, int length) throws SAXException {
System.out.println("node value:" + new String(ch, start, length));
}
}
Stax
public class StaxTest {
public static void main(String[] args) {
final String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<person>" +
"<name>brucelee</name>" +
"<age>28</age>" +
"</person>";
Stax(xml);
}
// Stax解析方式
private static void Stax(final String xml) {
XMLInputFactory inputFactory = XMLInputFactory.newInstance();
InputStream input = new ByteArrayInputStream((xml).getBytes());
try {
XMLEventReader xmlEventReader = inputFactory.createXMLEventReader(input);
while (xmlEventReader.hasNext()) {
XMLEvent event = xmlEventReader.nextEvent();
// 节点名称
if (event.isStartElement()) {
StartElement element = event.asStartElement();
System.out.println("start:"+element.getName());
}
// 节点值
if (event.isCharacters()) {
Characters text = event.asCharacters();
if (!text.isWhiteSpace()) {
System.out.println(text.getData());
}
}
// 节点名称
if (event.isEndElement()) {
EndElement element = event.asEndElement();
System.out.println("end:"+element.getName());
}
}
} catch (XMLStreamException e) {
e.printStackTrace();
}
}
}
观察整个实现方式,事件驱动的无论是代码和结构都非常清晰明了。