XML标准格式

1、XML大小写敏感

2、XML必须有结束标签,不能省;没有对应结束标签的必须以 / 结尾如:<img src =''test.text"/>

3、属性必须用引号括起来

4、所有属性必须有值,不能为空

Java库提供两种XML解析器

1、文档对象模型(Document Object Model,DOM) (tree parser)将读入的XML文档转换为树结构

2、简单API(Simple API for XML SAX) (Stream parser)将读入的XML文档转换为相应的事件

两种解析器比较:如果文档很长,生成树很耗内存,

如果不关心上下文,只关心元素,可以使用流。

DOM解析器示例代码:

//XML解析测试
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder =factory.newDocumentBuilder();
    File f = new File("test.txt");
    String uri = "c//me//test";
    FileInputStream inp = new FileInputStream("ss.text");
    //三种方式获取Document
    Document doc = builder.parse(inp);
    Document doc1 = builder.parse(f);
    Document doc2 = builder.parse(uri);
    Element root = doc.getDocumentElement();
    NodeList children = root.getChildNodes();
    int length = children.getLength();
    for(int i=0;i<length;i++)
    {
        Node child = children.item(i);
        //......操作代码,注意空白字符元素
        if(child instanceof Element)
        {
            Element childElement = (Element) child;
            String value = childElement.getNodeValue();
            String name = childElement.getNodeName();
            NamedNodeMap attributes = childElement.getAttributes();
            //.........
        }
    }
    XPathFactory xpfactory = XPathFactory.newInstance();
    XPath path = xpfactory.newXPath();
    path.evaluate("",doc);
}

SAX解析器:

SAX解析不会存储数据,只有事件如:

startElement和endElement 在每当遇到起始或终止标签时调用

characters 每当遇到字符数据时调用

startDocument和endDocument 分别在文档开始和结束时各调用一次

示例代码:

String url ="http://www.runoob.com/";

DefaultHandler handler = new DefaultHandler()
{
    public void startElement (String uri, String localName,
                              String qName, Attributes attributes)
            throws SAXException
    {
        if(localName.equals("a")&&attributes!=null)
        {
            for(int i = 0;i<attributes.getLength();i++)
            {
                String aname = attributes.getLocalName(i);
                if(aname.equals("href"))
                {
                    System.out.println(attributes.getValue(i));
                }
            }
        }
    }
};
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
InputStream in = new URL(url).openStream();
saxParser.parse(in,handler);

StAX解析器:

使用循环迭代事件

示例代码:

//StAX
InputStream in = new URL(url).openStream();
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader parser = factory.createXMLStreamReader(in);
while(parser.hasNext())
{
    int event = parser.next();
    if(event == XMLStreamConstants.START_ELEMENT)
    {
        if(parser.getLocalName().equals("a"))
        {
            String href = parser.getAttributeValue(null,"href");
            //....
        }
    }
}

写出XML:

DOM

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder =factory.newDocumentBuilder();
Document newdoc = builder.newDocument();
Element root = newdoc.createElement("root");
root.setAttribute("name","value");
Element child = newdoc.createElement("child");
Text text = newdoc.createTextNode("test");
newdoc.appendChild(root);

StAX

File f = new File("test.txt");
FileOutputStream out = new FileOutputStream(f);
XMLOutputFactory factory1 = XMLOutputFactory.newInstance();
XMLStreamWriter writer = factory1.createXMLStreamWriter(out);
writer.writeStartDocument();
writer.writeStartElement("name");
writer.writeAttribute("name","value");
writer.writeCharacters("");
//......