java解析xml常用的4种方法(这4种可以解决开发中遇到的xml解析的所有问题)
第一种 dom解析
<?xml version="1.0" encoding="GBK"?>
<address>
<linkman>
<name>Van_DarkHolme</name>
<email>van_darkholme@163.com</email>
</linkman>
<linkman1>
<name>Bili</name>
<email>Bili@163.com</email>
</linkman1>
</address>
public void readXml() throws Exception {
//建立DocumentBuilderFactor,用于获得DocumentBuilder对象:
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
//建立DocumentBuidler;
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
//import org.w3c.dom.Document;
Document document = documentBuilder.parse(new File("D:/1.xml"));
NodeList node = document.getElementsByTagName("linkman");
for (int i = 0; i < node.getLength(); i++) {
Element e = (Element)node.item(i);
String name = e.getElementsByTagName("name").item(0).getFirstChild().getNodeValue();
String email = e.getElementsByTagName("email").item(0).getFirstChild().getNodeValue();
System.out.println(name);
System.out.println(email);
}
结果:
Van_DarkHolme
van_darkholme@163.com
或者:
@Test
void contextLoads() throws ParserConfigurationException, IOException, SAXException {
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document document = documentBuilder.parse("F:\\testxml\\xmlText.xml");//注意路径不能包含中文,否则会报错
NodeList node = document.getElementsByTagName("linkman");
for (int i = 0; i < node.getLength(); i++) {
Element e = (Element)node.item(i);
String name = e.getElementsByTagName("name").item(0).getFirstChild().getNodeValue();
String email = e.getElementsByTagName("email").item(0).getFirstChild().getNodeValue();
System.out.println(name);
System.out.println(email);
}
}
第二种 dom4j解析
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book id="001">
<id>9</id>
<title>Harry Potter</title>
<author>J K. Rowling</author>
</book>
<book id="002">
<title>Learning XML</title>
<author>Erik T. Ray</author>
</book>
<book1 id="003">
<title>Learning XML111</title>
<author>Erik T. Ray111</author>
</book1>
</books>
引入dom4j jar包
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.3</version>
</dependency>
public void readXml() throws Exception{
//1.创建Reader对象
SAXReader saxReader = new SAXReader();
//2.加载xml
Document document = saxReader.read(new File("D:/1.xml"));
//3.获取根节点
Element rootElement = document.getRootElement();
// rootElement.elements()获取根节点下所有的节点,
List<Element> elements = rootElement.elements();
//获取节点book1下属性为id的值 003
rootElement.element("book1").attribute("id").getValue();
for (Element element : elements) {
//依次遍历根节点下的节点 book book book1
element.getName();
//依次遍历根节点下的节点对应属性为id的值 001 002 003
System.out.println(element.attribute("id").getValue());
System.out.println("----------------------------");
//同样道理 继续依次获取该节点下的节点
List<Element> child = element.elements();
for (Element element1 : child) {
/依次/获取子节点 id title author 、title author、title author
element1.getName();
//依次获取子节点的值 9 Harry Potter J K. Rowling、.......
System.out.println(element1.getText());
}
}
// 获取第二个节点book的属性为id的值 002
elements.get(1).attribute("id").getValue();
// 获取根节点下第二个节点book所有节点
List<Element> elements1 = elements.get(1).elements();
//获取根节点下第二个节点book节点下的第二个节点author的值 Erik T. Ray
elements.get(1).elements().get(1).getText();
}
结果:
第三种 XPath解析
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book id="001">
<id>9</id>
<title>Harry Potter</title>
<author>J K. Rowling</author>
</book>
<book id="002">
<title>Learning XML</title>
<author>Erik T. Ray</author>
</book>
<book1 id="003">
<title>Learning XML111</title>
<author>Erik T. Ray111</author>
</book1>
</books>
导入依赖
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/jaxen/jaxen -->
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1.6</version>
</dependency>
@Test
void c() throws DocumentException {
//1.创建Reader对象
SAXReader saxReader = new SAXReader();
//2.加载xml
Document document = saxReader.read(new File("F:\\testxml\\xmlText2.xml"));
List<Node> node = document.selectNodes("//title");
for (Node node1 : node) {
System.out.println(node1.getText());
}
System.out.println("---------------------------------");
Node n = document.selectSingleNode("//book[@id='001']//title");
System.out.println(n.getName()+":"+n.getText());
}
打印:
或者;
@Test
void d() throws FileNotFoundException, DocumentException {
FileInputStream inputStream = new FileInputStream("F:\\testxml\\xmlText2.xml");
//1.创建Reader对象
SAXReader saxReader = new SAXReader();
//2.加载xml
Document document = saxReader.read(inputStream);
List<Node> node = document.selectNodes("//title");
for (Node node1 : node) {
System.out.println(node1.getText());
}
System.out.println("---------------------------------");
Node n = document.selectSingleNode("//book[@id='001']//title");
System.out.println(n.getName()+":"+n.getText());
}
第四种 XPath解析网址请求返回的xml文件
接下来我们来解析一个可以查询手机号码相关信息的网址。
地址为(http://apis.juhe.cn/mobile/get?%20phone=16670002013&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253)
然后将解析这个网站将手机号码里面的内容解析出来。
@Test
void e() throws IOException, DocumentException {
//1、获取到xml资源的输入流
String phone = "16670002013";
URL url = new URL("http://apis.juhe.cn/mobile/get?%20phone=" + phone + "&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253");
//打开链接
URLConnection conn = url.openConnection();
//拿下网址的输入流
InputStream is = conn.getInputStream();
//2、创建一盒XML读取对象
SAXReader sr = new SAXReader();
//3、通过读取对象 读取xml数据吗,并返回文档对象
Document doc = sr.read(is);
//4.XPATH寻找地址
Node node = doc.selectSingleNode("//company");
System.out.println("号码附属公司:" + node.getText());
}
打印:
提示:
- 使用dom解析将xml树结构全部加载到内存中,保留了树结构,可以对树结构进行增删改 但是xml过大会导致内存溢出
- dom4j的SAXread是一行一行的解析的,不会产生内存问题,但是不能进行增删改操作
版权声明:本文为weixin_49419695原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。