JVerice Java Dev Engineer

XML

2017-09-13
JVerice
XML  Java

对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);


Similar Posts

上一篇 操作文件

下一篇 Eclipse快捷键

Comments