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("");
//......