xml

1.xml介绍

XML 可以用于描述数据、存储数据、传输(交换)数据。也可用于配置文件。

  • 写法格式:同 html 样式
  • 仅关注数据本身
  • 标记可扩展,可自定义

2.语法规范

(1)必须有 XML 文档声明:

<?xml version="1.0"?>
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" standalone="yes"?>
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
  • <?xml:文档声明的开始,表示当前是xml文档
  • version:xml的版本,目前只有"1.0"
  • encoding:编码
  • standalone:xml文档是否独立,默认是yes
  • ?>:xml文档声明结束

(2)必须有且仅有一个根元素

(3)严格区分大小写

(4)属性值用引号(双引号或单引号) :等号分开的名称-值对;在一个元素上,相同的属性只能出现一次

(5)标记成对

(6)空标记关闭

(7)元素正确嵌套

注意文本文件保存时候默认的编码格式是ANSI,需用记事本把它手动改为UTF-8保存。

3.元素命名规则

(1)名称中可以包含字母、数字或者其他可见字符;

(2)名称不能以数字开头;

(3)不能以 XML/xml/Xml…开头;

(4)名称中不能含空格;

(5)名称中不能含冒号(注:冒号留给命名空间使用)

4.实体

实体叫 ENTITY,实体的作用是避免重复输入。作用相当于宏或者变量。

(1)内置的 5 种实体

实体 符号

&lt; <
&gt; >
&amp; &
&quot; "
&apos; '

(2)自定义实体

<!DOCTYPE 根元素[
	<!ENTITY 实体名 "实体内容">
]>

使用已定义的实体:&实体名;

5.文档类型声明

文档类型定义——DOCTYPE,文档类型声明,紧跟 XML 声明之后,包含所有实体声明

<?xml version="1.0" encoding="utf-8"?>

    <!DOCTYPE 根元素标记名[
    <!--实体声明-->
    ]>

6.组成

(1)所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:

  • 元素
  • 属性
  • 实体
  • PCDATA
  • CDATA
  • CDATA 节(character data)

(2)CDATA

用于把整段文本解释为纯字符数据而不是标记的情况。如包含大量的<、>、&、或者"
字符。CDATA 节中的所有字符都会被当做元素字符数据的常量部分,而不是 XML 标记,
可以输入除]]>外任意字符,不能嵌套。

(3)PCDATA
PCDATA 的意思是被解析的字符数据(parsed character data)。
可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。
PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。
文本中的标签会被当作标记来处理,而实体会被展开。
不过,被解析的字符数据不应当包含任何 &、< 或者 > 字符;需要使用 &、< 以及 >
的内置实体来分别替换它们。

7.XML 解析

(1)DOM 解析过程

  • 如果一个程序需要进行 DOM 解析读取操作的话,也需要按照如下的步骤进行:

① 建 立 DocumentBuilderFactory : DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
②建立 DocumentBuilder: DocumentBuilder builder = factory.newDocumentBuilder();
③建立 Document : Document doc = builder.parse(“要解析的文件路径”);
④建立 NodeList : NodeList nl = doc.getElementsByTagName(“读取节点”);
⑤进行 XML 信息读取

  • DOM 操作除了可以进行解析外,也可以进行文档的生成

如果想要生成 XML 文件,则在创建文档的时候,就应该使用 newDocument()方法
如果要将 DOM 的文档输出,本身是比较麻烦的 。一次编写多次 copy

public static void createXml() throws Exception{
//获取解析器工厂
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
//获取解析器
DocumentBuilder builder=factory.newDocumentBuilder();
//创建文档
Document doc=builder.newDocument();
//创建元素、设置关系
Element root=doc.createElement("people");
Element person=doc.createElement("person");
Element name=doc.createElement("name");
Element age=doc.createElement("age");
name.appendChild(doc.createTextNode("shsxt"));
age.appendChild(doc.createTextNode("10"));
doc.appendChild(root);
root.appendChild(person);
person.appendChild(name);
person.appendChild(age);
//写出去
// 获得变压器工厂
TransformerFactory tsf=TransformerFactory.newInstance();
Transformer ts=tsf.newTransformer();
//设置编码
ts.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
//创建带有DOM节点的新输入源,充当转换Source树的持有者
DOMSource source=new DOMSource(doc);
//充当转换结果的持有者
File file=new File("src/output.xml");
StreamResult result=new StreamResult(file);
ts.transform(source, result);
}

(2)SAX 解析

如果要想实现这种 SAX 解析,则肯定首先建立一个 SAX 的解析器

// 1、创建解析器工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
// 2、获得解析器
SAXParser parser = factory.newSAXParser();
// SAX解析器 ,继承 DefaultHandler
String path = new File("resource/demo01.xml").getAbsolutePath();
// 解析
parser.parse(path, new MySaxHandler());

(3)DOM4j 解析

可以使用 DOM4J 进行 XML 文件的读、写操作

  • 解析
File file = new File("resource/outputdom4j.xml");
SAXReader reader = new SAXReader();
// 读取文件作为文档
Document doc = reader.read(file);
// 获取文档的根元素
Element root = doc.getRootElement();
// 根据跟元素找到全部的子节点
Iterator<Element> iter = root.elementIterator();
while(iter.hasNext()){
Element name = iter.next();
System.out.println("value = " + name.getText());
}
  • 创建
// 使用DocumentHelper来创建 Document对象
Document document = DocumentHelper.createDocument();
// 创建元素并设置关系
Element person = document.addElement("person");
Element name = person.addElement("name");
Element age = person.addElement("age");
// 设置文本
name.setText("shsxt");
age.setText("10");
// 创建格式化输出器
OutputFormat of = OutputFormat.createPrettyPrint();
of.setEncoding("utf-8");
// 输出到文件
File file = new File("resource/outputdom4j.xml");
XMLWriter writer = new XMLWriter(new FileOutputStream(new
File(file.getAbsolutePath())),of);
// 写出
writer.write(document);
writer.flush();
writer.close();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值