“怎么样了?”
“太好了。不能抱怨。今天 Bilaabo 告诉我关于 JavaScript 的事。当然不是全部,但不仅仅是一点点。当然,我还没有用 JS 写过任何东西,但我认为这不会是难的。”
“Ellie 向我介绍了 JSON 序列化。你解释了 Jackson 框架以及如何使用注释设置‘多态反序列化’。”
“不可能!你现在很聪明,阿米戈!一个真正的种马!”
“然后还有一些!”
“好的。让我们开始工作吧。今天我们有一个有趣的新话题:XML。 ”
“XML 是一种表示数据的标准,可以很容易地被人类读取——甚至更容易被程序读取。下面是一个 XML 文件示例:”
<data>
<owner first="Adam" last="Shelton">
<address>London</address>
</owner>
<cat name="Missy" age="15"/>
</data>
“XML 的基础是标签。标签是尖括号中的一个词(大于号和小于号)。有开始和结束标签。每个开始标签都有一个对应的结束标签。开始标签可以有属性。 “
“标签可以嵌套在标签内,从而创建一个元素树。顶级标签称为根:它有子标签,而子标签又有自己的子标签。”
“这里有些例子:”
标签 | 描述 |
---|---|
<数据> | 打开数据标签 |
</数据> | 结束数据标签 |
<猫 名=“大小姐”年龄=“ 15 ”> | 具有属性的标签。属性值用引号括起来 |
<data> <owner> <cat name = "Missy"/> </owner> </data> |
嵌套标签。 |
<猫名=“大小姐”年龄=“15” /> | 自闭标签。 这样的标签不需要结束标签。 而且他们不能有子标签。 |
<info> 任何类型的信息都可以在这里 </info> |
标签可以包含文本数据 |
<info> 任何类型的 <data xxx = "yyy"> </data> 信息 <data 2xxx = "yyy"/> 都可以在这里 </info> |
一个标签可能包含散布在其他标签中的文本数据。 |
“看起来很简单,有哪些标签?”
“任何一种。没有保留标签。XML 是一种描述任何数据的语言。人们想出满足他们需要的标签,并就如何使用它们达成一致。”
“从本质上讲,XML 是一种将数据写入计算机可以理解的元素树的方法。”
“我想我现在明白了。顺便问一下,我有一个问题。”
“JSON 用于将数据从浏览器发送到服务器,但是 XML 用在什么地方?”
“在使用 JSON 的相同地方:用于存储和发送数据。”
“好,我们继续。”
“想象一下,你有一个共享的 XML 文件,它存储了一个由 20 个人编写的程序的数据。他们每个人都有自己的标签,他们很快就开始相互干扰。”
“为了确保标签是唯一的,发明了前缀。这就是它们的样子:”
标签 | 描述 |
---|---|
<动物:猫> | 带有动物前缀的猫标签 |
<动物:猫> </动物:猫> <动物园:猫> </动物园:猫> |
两个带有不同前缀的猫标签。 |
<动物:猫 动物园:名称=“MX”> | 带有动物前缀的猫标签。带有zoo前缀的名称属性。 |
“前缀也称为命名空间。如果我们称它们为命名空间,那么表中的最后一个描述将变为‘具有动物命名空间的猫标签。具有动物园命名空间的名称属性。’”
“顺便说一下,你还记得在 Java 中每个类都有一个短名称和一个包含包名称的唯一长名称,在导入包时也指定了包名称吗?”
“是的。”
“嗯,前缀也有唯一的长名,导入的时候也是指定的: ”
< data xmlns:soap="http://cxf.apache.org/bindings/soap" > < soap : item> < soap :info/> </ soap :item > </data>
“‘ xml ns : soap’的意思是‘ XML — name s pace SOAP’”
“您还可以设置没有前缀的标签的唯一名称: ”
<data xmlns = "http://www.springframework.org/schema/beans" xmlns: soap = "http://cxf.apache.org/bindings/soap" xmlns:task = "http://www.springframework .org/schema/task" > < soap :item> < soap :info/> < task :info/> </ soap :item> </data>
“'xmlns=…'为空前缀设置命名空间。换句话说,它为没有前缀的标签设置命名空间,例如上例中的数据。”
“您可以在文档中拥有任意数量的命名空间,但每个命名空间都必须具有唯一的名称。”
“我明白了。为什么这些命名空间有这么奇怪的唯一名称?”
“它们通常指示指向描述命名空间和/或其 XML 标记的文档的 URL。”
“你今天甩了我很多信息,还有什么?”
“还有一点。”
“首先,XML有一个头部。它是描述XML版本和文件编码的特殊行。”它通常是这样的:
“它通常看起来像这样:”
<?xml 版本= "1.0" 编码= "UTF-8"?>
<数据 xmlns:soap = "http://cxf.apache.org/bindings/soap">
<肥皂:项目>
<肥皂:信息/>
</肥皂:项目>
</数据>
“您还可以向 XML 添加注释。要开始注释,请使用 '<!--'。要结束它,请使用 '-->'。”
<?xml version = "1.0" encoding = "UTF-8"?>
<data xmlns:soap = "http://cxf.apache.org/bindings/soap">
<soap:item>
<!-- <soap:info/> -->
</soap:item>
<!-- This is also a comment -->
</data>
“我现在明白了。”
“某些符号(<>”&)在XML中有特殊的含义,所以不能在别处使用。我们可以使用转义序列来绕过这个限制——一组用于表示其他字符/符号的字符。这里是其中的一些:”
转义序列 | 它替换的符号 |
---|---|
& | & |
“ | « |
< | < |
> | > |
’ | ' |
“这里是一个嵌入 XML 的代码示例:”
Java代码 | XML 中的 Java 代码 |
---|---|
|
<代码> 如果(a < b) System.out.println( " a 是最小值" ); </代码> |
“呃……看起来不太好看。”
“你会记得在 Java 中,一些字符也会被转义吗?例如,“\”。而且在写入 String 时,这个序列也必须写入两次?所以这很常见。”
“好的。”
“这就是我今天的全部内容。”
“万岁,终于可以休息了。”
GO TO FULL VERSION