解析XML文件(配置文件)

XML 简介

       XML 可扩展标记语言(eXtensible Markup Language),XML 标签没有被预定义,需要自行定义标签。

XML 元素与属性

<元素名 属性名1="属性值1" 属性名2="属性值2"></元素名>
<元素名 属性名1="属性值1" 属性名2="属性值2"/>

       在 XML 中,空格会被保留。所有元素都必须有关闭标签,XML 标签对大小写敏感,XML 的属性值必须加引号(单引号和双引号均可使用)。特定的属性名在同一个元素标记中只能出现一次。

示例:

<!-- xml的版本和编码格式 -->
<?xml version="1.0" encoding="UTF-8"?> 
<!-- 这里是注释 -->

<![CDATA[

]]>

       CDATA - (未解析)字符数据

XML 特殊字符替换

       ~!@#$%^*()-+={}[],.?/\:;| 在 xml 中是可以直接使用的。

       以下是不可以直接使用的字符,需要指定的字符进行替换:

实际替换
<&lt;
>&gt;
&&amp;
' &apos;
"&quot;

       对于无法正常使用的字符,也可采取几个自定义的固定字符来进行替换。

解析 XML 文件

  • XML的解析方式有四种:

    DOM解析;

    SAX解析;

    JDOM解析;

    DOM4J解析。

       这里只给出后面两种方式,下面为要解析的xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<!-- 注释 -->
<str>
    <test name="测试"/>
    <data>
        <mainTable>
            <field>
                <fieldName>ID1</fieldName>
                <fieldValue>内容ID1</fieldValue>
            </field>
            <field>
                <fieldName>ID2</fieldName>
                <fieldValue>内容ID2</fieldValue>
            </field>
		</mainTable>
    </data>
	
	<type typeName="元素名" tableName="0000">
		<user name="小红" age="16"/>
		<user name="小明" age="17"/>
		<user name="小王" age="18"/>
	</type>
</str>

Jdom

       所需jar包:下面例子采用的是jdom2-2.0.6.jar。也可以用jdom.jar。

常用方法说明
Document对象.getRootElement()获取根节点Element对象
Element对象.getChild(“节点名”);获取子节点对象
Element对象.getChildren()获取该节点下相同的节点生成List
Element对象.getAttributeValue(“属性名”)获取对应节点,对应属性名的属性值
Element对象.getValue()获取对应节点的文本值
Element对象.getName()获取对应节点的元素名
import java.io.File;
import java.io.FileInputStream;
import java.util.List;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;

public class JdomUtil {

	public static void main(String[] args) {
		JdomUtil.resolveXml("E:/final/SpringBoot/src/main/java/com/util/file/xml/test.xml");
	}

	public static void resolveXml(String path) {
		FileInputStream fis = null;
		try {
			fis = new FileInputStream(new File(path));
			SAXBuilder builder = new SAXBuilder();
			Document doc = builder.build(fis);
			// 获取根节点
			Element root = doc.getRootElement();
			System.out.println("根节点元素名:" + root.getName());
			// 获取子节点
			Element test = root.getChild("test");
			System.out.println("获取test节点的属性值:" + test.getAttributeValue("name"));

			Element data = root.getChild("data");
			Element mainTable = data.getChild("mainTable");
			List lists = mainTable.getChildren();
			for (int k = 0; k < lists.size(); k++) {
				Element field = (Element) lists.get(k);
				Element fieldName = field.getChild("fieldName");
				Element fieldValue = field.getChild("fieldValue");
				System.out.println(fieldName.getValue() + "-" + fieldValue.getValue());
			}

			Element node = root.getChild("type");
			System.out.println(node.getAttributeValue("typeName"));
			System.out.println(node.getAttributeValue("tableName"));

			// 遍历多个相同子节点
			List list = node.getChildren();
			String name = "", age = "";
			for (int i = 0; i < list.size(); i++) {
				Element user = (Element) list.get(i);
				name = user.getAttributeValue("name");
				age = user.getAttributeValue("age");
				System.out.println(name + "-" + age);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

运行结果:

在这里插入图片描述

Dom4J

       所需jar包:下面例子采用的是dom4j-1.6.1.jar。

常用方法说明
Document对象.getRootElement()获取根节点Element对象
Element对象.element(“子节点名”)获取子节点对象
Element对象.elementIterator()获取该节点下相同的节点生成Iterator
Element对象.attribute(“属性名”).getValue()获取对应节点,对应属性名的属性值
Element对象.getText()
Element对象.getStringValue()
获取对应节点的文本值
Element对象.getName()获取对应节点的元素名
import java.io.File;
import java.util.Iterator;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class Dom4JUtil {

	public static void main(String[] args) {
		Dom4JUtil.resolveXml("E:/jiaokong_datacenter_final/SpringBoot/src/main/java/com/util/file/xml/test.xml");
	}

	public static void resolveXml(String path) {
		SAXReader builder = new SAXReader();
		Document document = null;
		try {
			document = builder.read(new File(path));
		} catch (Exception e) {
			e.printStackTrace();
		}
		// 获取根节点
		Element root = document.getRootElement();
		System.out.println("根节点名:" + root.getName());
		// 获取子节点
		Element test = root.element("test");
		System.out.println("获取test节点的属性值:" + test.attribute("name").getValue());

		Element data = root.element("data");
		Element mainTable = data.element("mainTable");
		
		Iterator<Element> ite = mainTable.elementIterator();
		while (ite.hasNext()) {
			Element field = ite.next();
			Element fieldName = field.element("fieldName");
			Element fieldValue = field.element("fieldValue");
			System.out.println(fieldName.getStringValue() + "-" + fieldValue.getText());
		}

		Element node = root.element("type");
		System.out.println(node.attribute("typeName").getValue());
		System.out.println(node.attribute("tableName").getValue());

		Iterator<Element> iter = node.elementIterator();
		String name = "", age = "";
		while (iter.hasNext()) {
			Element user = iter.next();
			name = user.attribute("name").getValue();
			age = user.attribute("age").getValue();
			System.out.println(name + "-" + age);
		}
	}
}

运行结果:

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值