**XML 是不作为的。**也许这有点难以理解,但是 XML 不会做任何事情。XML 被设计用来结构化、存储以及传输信息。
下面是 John 写给 George 的便签,存储为 XML:
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
上面的这条便签具有自我描述性。它拥有标题以及留言,同时包含了发送者和接受者的信息。
但是,这个 XML 文档仍然没有做任何事情。它仅仅是包装在 XML 标签中的纯粹的信息。我们需要编写软件或者程序,才能传送、接收和显示出这个文档。
XML 没什么特别的。它仅仅是纯文本而已。有能力处理纯文本的软件都可以处理 XML。不过,能够读懂 XML 的应用程序可以有针对性地处理 XML 的标签。标签的功能性意义依赖于应用程序的特性。
XML 元素使用 XML 标签进行定义。
XML 标签对大小写敏感。在 XML 中,标签 与标签 是不同的。
必须使用相同的大小写来编写打开标签和关闭标签:
<Message>这是错误的。</message>
<message>这是正确的。</message>
注释:打开标签和关闭标签通常被称为开始标签和结束标签。不论您喜欢哪种术语,它们的概念都是相同的。
在 HTML 中,常会看到没有正确嵌套的元素:
<b><i>这是一个没有正确嵌套的HTML代码</b></i>
在 XML 中,所有元素都必须彼此正确地嵌套:
<b><i>XML标签必须正确嵌套</i></b>
在上例中,正确嵌套的意思是:由于 元素是在 元素内打开的,那么它必须在 元素内关闭。
XML 文档必须有一个元素是所有其他元素的父元素。该元素称为根元素。
<root>
<child>
<subchild>.....</subchild>
</child>
</root>
与 HTML 类似,XML 也可拥有属性(名称/值的对)。
在 XML 中,XML 的属性值须加引号。下面的两个 XML 文档。第一个是错误的,第二个是正确的:
<note date=08/08/2008>
<to>George</to>
<from>John</from>
</note>
<note date="08/08/2008">
<to>George</to>
<from>John</from>
</note>
XML的解析方式分为四种:1、DOM解析;2、SAX解析;3、JDOM解析;4、DOM4J解析。其中前两种属于基础方法,是官方提供的平台无关的解析方式;后两种属于扩展方法,它们是在基础的方法上扩展出来的,只适用于java平台。
在本地项目中有一个Demo.xml文件:
<?xml version="1.0" encoding="UTF-8" ?>
<books>
<book id="1001">
<name>三国演义</name>
<info>三国演义的简介</info>
</book>
<book id="1002">
<name>西游记</name>
<info>西游记的简介</info>
</book>
</books>
使用DOM4J.JAR包进行解析。解析代码:
public class Demo1 {
public static void main(String[] args) throws IOException, DocumentException {
//1.创建文件输入流对象
FileInputStream fis = new FileInputStream("Demo.xml");
//2.创建XML读取对象
SAXReader sr = new SAXReader();
//3.读取并获得文档读取对象
Document doc = sr.read(fis);
//4.获取文档根元素
Element root = doc.getRootElement();
//5.解析xml:获取根源元素名称
System.out.println(root.getName());
//6.获取子节点内容
Element book = root.element("book");//获取根节点下名为book的子节点
Element name = book.element("name");//获取子节点book的name标记
System.out.println(name.getText());//获取name标记包含的文本内容
//7.解析文件里全部内容
List<Element> es = root.elements();//获取根节点下全部子节点,并存入List集合
for (int i = 0; i < es.size(); i++) {
Element e = es.get(i);//获取List集合里的每一个子节点
System.out.println(e.attributeValue("id"));//获取并输出子节点中名为id的属性
System.out.println(e.elementText("name"));//获取并输出子节点的name标记中所包含的Text
System.out.println(e.elementText("info"));//获取并输出子节点的info标记中所包含的Text
System.out.println("------------");
}
fis.close();
}
}
调用juhe接口API查询手机号归属地。回转的XML:
<root>
<resultcode>200</resultcode>
<reason>Return Successd!</reason>
<result>
<province>山东</province>
<city>菏泽</city>
<areacode>0530</areacode>
<zip>274000</zip>
<company>移动</company>
<card/>
</result>
<error_code>0</error_code>
</root>
解析代码:
public class Demo2 {
public static void main(String[] args) throws IOException, DocumentException {
System.out.println("请输入需要查询的手机号:");
String phoneNum = new Scanner(System.in).nextLine();
//1.获取网络传输的xml输入流
URL url = new URL("http://apis.juhe.cn/mobile/get? phone="+phoneNum
+"&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253");
URLConnection urlConnection = url.openConnection();//建立连接
InputStream is = urlConnection.getInputStream();//获取输入流
//2.创建一个xml读取对象
SAXReader sr = new SAXReader();
//3.读取输入流,获取xml数据,并返回文档对象
Document doc = sr.read(is);
//4.获取根节点
Element root = doc.getRootElement();
//5.解析根节点内容
String resultcode = root.elementText("resultcode");//响应状态码
Element result = root.element("result");//响应结果集:归属地信息
String province = result.elementText("province");//省份
String city = result.elementText("city");//城市
String company = result.elementText("company");//运营商
if ("200".equals(resultcode)){
//6.输出结果
System.out.println("手机号:"+phoneNum+"的归属地信息为:");
System.out.println("运营商:"+company);
System.out.println("省份:"+province);
System.out.println("城市:"+city);
}else {
System.out.println("查询失败!");
}
}
}
解析本地Demo.xml文件,解析代码:
public class Demo3 {
public static void main(String[] args) throws FileNotFoundException, DocumentException {
//1.创建文件输入流对象
FileInputStream fis = new FileInputStream("Demo.xml");
//2.创建XML读取对象
SAXReader sr = new SAXReader();
//3.读取并获得文档读取对象
Document doc = sr.read(fis);
//4.通过Document和XPATH,寻找所有的name节点
List<Node> names = doc.selectNodes("//name");
//5.获取节点信息
System.out.println("遍历所有节点的name标记:");
for (int i = 0; i < names.size(); i++) {
//获取标记名称
System.out.print(names.get(i).getName()+":");
//获取标记文本内容
System.out.println(names.get(i).getText());
}
System.out.println("使用selectSingleNode()方法查询根节点下id属性值为1001的book节点:");
Node node = doc.selectSingleNode("//book[@id='1001']//name");
System.out.println(node.getName()+":"+node.getText());
}
}
生成代码:
public class Demo4 {
public static void main(String[] args) throws IOException {
//1. 通过文档帮助器 (DocumentHelper) , 创建空的文档对象
Document doc = DocumentHelper.createDocument();
//2. 通过文档对象, 向其中添加根节点
Element root = doc.addElement("books");
//3. 通过根节点对象root , 丰富子节点
for (int i = 1; i <= 10; i++) {
Element book = root.addElement("book");
Element name = book.addElement("name");
Element info = book.addElement("info");
book.addAttribute("id",1000+i+"");
name.setText("三国演义"+i);
info.setText(name.getText()+"的简介");
}
//4. 创建一个文件输出流 ,用于存储XML文件
FileOutputStream fos = new FileOutputStream("books.xml");
//5. 将文件输出流, 转换为XML文档输出流
XMLWriter xmlWriter = new XMLWriter(fos);
//6. 写出文档
xmlWriter.write(doc);
//7. 释放资源
fos.close();
}
}
JSON的全称是”JavaScript Object Notation”,意思是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式。XML也是一种数据交换格式,为什么没有选择XML呢?因为XML虽然可以作为跨平台的数据交换格式,但是在JS(JavaScript的简写)中处理XML非常不方便,同时XML标记比数据多,增加了交换产生的流量,而JSON没有附加的任何标记,在JS中可作为对象处理,所以我们更倾向于选择JSON来交换数据。
JSON有两种表示结构,对象和数组。
对象结构以”{”大括号开始,以”}”大括号结束。中间部分由0或多个以”,”分隔的”key(关键字)/value(值)”对构成,关键字和值之间以”:”分隔,语法结构如代码。
{
key1:value1,
key2:value2,
...
}
其中关键字是字符串,而值可以是字符串,数值,true,false,null,对象或数组
数组结构以”[”开始,”]”结束。中间由0或多个以”,”分隔的值列表组成,语法结构如代码。
[
{
key1:value1,
key2:value2
},
{
key3:value3,
key4:value4
}
]
之前我一直有个困惑,分不清普通字符串,json字符串和json对象的区别。经过一番研究终于给弄明白了。比如在js中。
字符串:这个很好解释,指使用“”双引号或’’单引号包括的字符。例如:var comStr = ‘this is string’;
json字符串:指的是符合json格式要求的js字符串。例如:var jsonStr = “{StudentID:‘100’,Name:‘tmac’,Hometown:‘usa’}”;
json对象:指符合json格式要求的js对象。例如:
var jsonObj = {
StudentID: "100",
Name: "tmac",
Hometown: "usa"
};
因篇幅问题不能全部显示,请点此查看更多更全内容