解析XML
DOM(Java提供) (整个文件加载到内存中去执行解析)
SAX(Javat提供)
DOM4J
JDOM
DOM解析
1:创建DocumentBuilderFactory
2:创建DocumentBuilder对象
3:使用DocumentBuilder对象parse xml文件 ,得到Document对象;
上面给出的是Node下定义的3种类型,Node定义的类型不止这3种,一共有12种;
DOM解析XML:
XML 是一个树形数据结构,DOM解析下的XML分别由Element,Attr等构成,上面的3个类分别实现了Node接口,注意:xml 中认为#text内容也是一个子节点;Document为整个文件;
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book id="1" idd = "2222">
<name>全力的优秀</name>
<author>conan</author>
<year>2014</year>
<price>89</price>
</book>
<book id="2">
<name>悟空</name>
<year>2004</year>
<price>77</price>
<language>English</language>
</book>
</bookstore>
1 DOM 解析XML 准备工作
通过准备工作,解析到指定xml文件的Document对象(xml的root node);
// 创建DocumentBuilderFactory对象
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 创建DocumentBuilder对象
DocumentBuilder documentBuilder = factory.newDocumentBuilder();
//解析xml对象
Document document = documentBuilder.parse("books.xml");
2 使用DOM解析xml文件获取Root node的信息
Element documentElement = document.getDocumentElement();
3 使用DOM解析xml文件:解析Document下的Element
//首先获取Document下的子节点 这里好像不能不知道名字的情况下获取所有的子节点;
//getElementById:Element getElementsByTagName:NodeList getElementsByTagNameNS:NodeList
NodeList books = document.getElementsByTagName("book");
Element book = (Element) books.item(i);
//获取节点名 getFirstChild() 是因为:#text 也是一个字节点
book.getFirstChild().getNodeValue();
//获取节点值
book.getFirstChild().getNodeName();
//获取节点类型
book.getFirstChild().getNodeType(); //用于过滤#text
4 使用DOM解析xml文件的属性名和属性值:解析Element的属性Attr
// public NamedNodeMap getAttributes(); (Node类下)
// public Attr getAttributeNode(String name); (Element下的)
// 获取所有的属性Attr
NamedNodeMap attributes = book.getAttributes();
// 如果知道属性id 可以直接获取属性的值
String id = book.getAttribute("id");
5 修改,保存XML
使用DOM 修改XML ,需要先准备好子节点,最终在appendChild 到root node上去;这些操作都只发生在内存上, 并不会真正的写入到文件;
如果需要保存到文件,需要借助TransformerFactory#newTransformer保存到硬盘;
//构造保存方法的lambda表达式,传入根节点、路径文件
BiConsumer<Node, String> saveDomTree = (root, strPath) -> {
try {
//【保存】1、创建转换工厂
TransformerFactory tff = TransformerFactory.newInstance();
//【保存】2、创建转换器
Transformer tf = tff.newTransformer();
//【保存】3、设置转换器,会根据标签自动添加不同的声明,XML<?xml?>,HTML<META>
tf.setOutputProperty(OutputKeys.VERSION, "1.0");
tf.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
//【保存】4、获取数据源
DOMSource doms = new DOMSource(root);
//【保存】5、设置保存位置,已经存在的文件被覆盖,不存在自动创建
StreamResult sr = new StreamResult(strPath);
//【保存】6、执行
tf.transform(doms, sr);
} catch (TransformerException e) {
e.printStackTrace();
}
};
saveDomTree.accept(documentElement, "books2.xml");
网友评论