JSON与XML解析
json 待整理
xml
基础常识
- 原样输出内容: <![CDATA[ 内容内容 ]]>
- 约束: dtd 和 schema (文件以 .xsd 结尾)
- 引入css样式
- xml版本 version
-
一 解析方式
1. DOM: 一次性将文本加载进内存,形成dom树
- 优点: 操作方便,对文档可以进行CURD操作
- 缺点: 占内存
2. SAX: 逐行读取,基于事件驱动,读取一行之后释放一行
二 xml解析器:
1. JAXP
2. DOM4J
3. pull Android 内置解析器, SAX方式
4. jsoup
- java的HTML解析器, 可以通过DOM, CSS和类似JQuery的方式操作
- Jsoup 工具类,主要获取Document
- Document 文档对象,代表树
- Elements Element对象集合
- Element 元素对象
- Node 节点对象
Xpath
// 测试代码
import cn.wanghaomiao.xpath.exception.XpathSyntaxErrorException;
import cn.wanghaomiao.xpath.model.JXDocument;
import cn.wanghaomiao.xpath.model.JXNode;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
* xml 解析
*/
public class JsoupTest {
public static void main(String[] args) throws IOException, XpathSyntaxErrorException {
// 获取document对象
String path = JsoupTest.class.getClassLoader().getResource("c3p0-config.xml").getPath();
System.out.println("xml文件: " + path);
Document document = getDocument(path);
Elements elements = documentTest(document);
elementTest(elements);
System.out.println("Xpath 方式获取元素集合");
JXDocument jxDocument = new JXDocument(document);
List<JXNode> jxNodes = jxDocument.selN("//property");
for (JXNode jxNode : jxNodes) {
// 可以转换为元素对象
System.out.println(jxNode.getElement());
}
}
/**
* Jsoup 获取Document对象
*
* @param path xml 路径
*
* @return Document 文档操作对象
*
* @throws IOException
*/
private static Document getDocument(String path) throws IOException {
// 1. 根据文件流获取document
File file = new File(path);
Document document = Jsoup.parse(file, "UTF-8");
// 根据字符串直接获取
InputStream in = new FileInputStream(path);
byte[] bytes = new byte[1024];
StringBuilder sb = new StringBuilder();
int len = 0;
while ((len = in.read(bytes)) != -1) {
sb.append(new String(bytes, 0, len));
}
Document document2 = Jsoup.parse(sb.toString());
in.close();
return document;
}
/**
* document 对象操作方法
* 类似JavaScript dom节点操作对象的方法
*
* @param document 文档对象
*
* @return Elements
*/
private static Elements documentTest(Document document) {
// 这三个方法是Document从Element对象继承来的, 从当前节点开始搜索
System.out.println("根据标签名称获取点对应Element集合");
Elements property = document.getElementsByTag("property");
for (Element element : property) {
System.out.println(element);
}
System.out.println("根据属性名称获取对应Element集合");
Elements name = document.getElementsByAttribute("name");
for (Element element : name) {
System.out.println(element);
}
System.out.println("根据属性名和属性值获取对应Element集合");
Elements name1 = document.getElementsByAttributeValue("name", "user");
for (Element element : name1) {
System.out.println(element);
}
System.out.println("selector 选择器选择 类似 Css选择器");
Elements select = document.select("property[name=\"user\"]");
return name;
}
/**
* 元素对象集合
*
* @param elements 元素对象集合
*/
private static void elementTest(Elements elements) {
System.out.println("elementTest");
for (Element element : elements) {
System.out.println(" 1. 获取属性值");
System.out.println(element.attr("name"));
System.out.println("text 类似 text");
System.out.println(element.text());
System.out.println("html 类似 innerHtml");
System.out.println(element.html());
}
}
}