对XML的处理
解析XML文档
要处理XML文档,就要先解析(parse)它。 解析器是这样一个程序:它读入一文件,确认这个文件具有正确的格式,然后 其分解成各种元素,使得程序员能够访问这些元素。 Java库提供两种XML解析器:
- 文档对象模型(DOM):将读入的XML转换成树结构。
- XML简单API(SAX):在读入XML文档时生成相应的事件。
使用DOM解析器
DOM解析器完整地读入XML文档,然后将其转换成一个树形的数据结构,适合于大多数应用
1.获取DocumentBulider对象
DocumentBuliderFactory factory = DocumentBuliderFactory.newInstance();
DocumentBulider bulider = factory.newDocumentBulider();
2.从文件中读入某个文档:
File f = ....
Url u =...
InputStream in = ...
Document doc = bulider.parse(f或u或in);
3.对文档内容分析
Element root = doc.getDocumentElement();
root.getTagName();//返回元素的标签名
4.枚举子元素
<font>
<name>JVerice</name>
<size unit="pt">23</size>
</font>
NodeList children =root.getChildNode();
for(int i=0;i<children.getLength();i++){
Node child = childern.item(i);
if(child instanceof Element){ //忽略空白字符
Element childElement = (Element)child;
Text textNode = (Text)childElement.getFirstChild();
String text = textNode.getDate().trim(); //调用.trim()删除空行
if(childElement.getTagName.equal("name")
name = text;
else if(childElement.getTagName.equal("size")
size = Integer.parseInt(text);
}
}
5.枚举节点的属性
NamedNodeMap attributes = element.getAttributes();
for(int i=0; i<attributes.getLength(); i++){
Node attribute = attributes.item(i);
String name = attribute.getNodeName();
String value = attribute.getNodeValue();
...
}
如果知道属性名。直接获取相应属性值:
String unit = element.getAttribute("unit");
流机制解析器
文档很大,且处理算法简单,可以再运行时解析节点,而不必看到完整的树形结构,DOM显得效率低下。这时应该使用流机制解析器
使用SAX解析器
SAX解析器在解析XML输入的组成部分时会报告事件,但不会以任何方式存储文档,而是由事件处理器建立相应的数据结构。
ContentHandler接口定义了若干个在解析文档时解析器会调用的回调方法:
* startElement和endElement 在每当遇到起始或终止标签时调用。
* characters 在每当遇到字符数据时调用,
* startDocument和endDocument分别在文档开始和结束时各调用一次。
下面是如何得到SAX解析器的代码:
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factoru.newSAXParser();
处理文档:
parser.parse(source,handler);
source:一个文件,一个URL字符串或者是一个输入流。
handler:DefaultHandler的一个子类
默认未开启命名空间,开启命名空间:
factory.setNamespaceAware(true);
使用StAX解析器
StAX解析器是一种“拉解析器(pull parser)”,与安装事件处理器不同,只需要使用下面的基本循环来迭代所有的事件:
InputStream in = url.openStream();
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader parser = factory.createSMLStreamReader(in);
while(parser.hasNext()){
int event = parser.next();
}
<font>
<name>JVerice</name>
<size units="pt">23</size>
</font>
1.获取当前元素units的属性
String units = parser.getAttributeValue(null,"units");
2.默认启用命名空间,关闭为:
factory.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE,false);