xml是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。
它与
Access,
Oracle和
SQL Server等数据库不同,数据库提供了更强有力的
数据存储和分析能力,例如:数据索引、排序、查找、相关一致性等,它仅仅是存储数据。事实上它与其他数据表现形式最大的不同是:它极其简单,这是一个看上去有点琐细的优点,但正是这点使它与众不同。
它和
超文本标记语言语法区别:
超文本标记语言的标记不是所有的都需要成对出现,它则要求所有的标记必须成对出现;HTML标记不区分大小写,它则大小敏感,即区分大小写。
XML的简单使其易于在任何应用程序中读写数据,这使XML很快成为数据交换的唯一公共语言,虽然不同的应用软件也支持其它的数据交换格式,但不久之后他们都将支持XML,那就意味着程序可以更容易的与Windows, Mac OS, Linux以及其他平台下产生的信息结合,然后可以很容易加载XML数据到程序中并分析它,并以XML格式输出结果。
-
某些起始标签可以选择性出现结束标签或者隐含了结束标签。
-
标签可以以任何顺序嵌套。即使结束标签不按照起始标签的逆序出现也是允许的,例如,This is a samplestring是正确的。
-
某些特性不要求一定有值,例如中的“不换行”( 外语: nowrap)特性。
-
定义特性的两边有没有加上双引号都是可以的,所以都是允许的。
1
2
|
<百度百科
词条="可扩展标记语言">
|
1
|
<!--和-->
|
1
2
|
<百度百科
词条=可扩展标记语言>
|
这些问题使建立一个标准通用标记语言的解析器变成了一项艰巨的任务,判断何时应用以上规则的困难导致了标准通用标记语言语言的定义一直停滞不前,以这些问题作为出发点,XML逐渐步入我们的视野。
XML去掉了之前令许多开发人员头疼的标准通用标记语言的随意语法。在XML中,采用了如下的语法:
一、任何的起始标签都必须有一个结束
标签。
二、可以采用另一种简化语法,可以在一个标签中同时表示起始和结束标签。这种语法是在大于符号之前紧跟一个斜线(/),例如<百度百科词条/>。XML解析器会将其翻译成<
百度百科词条></百度百科词条>。
三、标签必须按合适的顺序进行
嵌套,所以结束标签必须按
镜像顺序匹配起始标签,例如
这是一串百度百科中的样例字符串。这好比是将起始和结束标签看作是数学中的左右括号:在没有关闭所有的内部括号之前,是不能关闭外面的括号的。
四、所有的特性都必须有值。
五、所有的特性都必须在值的周围加上双引号。
这些规则使得开发一个XML解析器要简便得多,而且也除去了解析
标准通用标记语言中花在判断何时何地应用那些奇怪语法规则上的工作。仅仅在XML出现后的前六年就衍生出多种不同的语言,包括
MathML、
SVG、
RDF、
RSS、
SOAP、
XSLT、
XSL-FO,而同时也将
HTML改进为
XHTML。
下面是java和xml的使用
下面是java和xml的使用
package mypack;
import java.io.IOException;
import javax.lang.model.element.Element;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class Test {
public static void main(String[] args) throws ParserConfigurationException {
// TODO Auto-generated method stub
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
try {
//创建DocumentBuilder对象
DocumentBuilder db=dbf.newDocumentBuilder();
//通过DocumentBuilder 对象的parse方法加载book.xml文件到当前的目录下
Document document=db.parse("book.xml");
//获取所有的book结点的集合
NodeList booklist=document.getElementsByTagName("book");
//通过GetLength方法得到结点的个数
System.out.println(booklist.getLength());
//遍历每一个book结点
for(int i=0;i<booklist.getLength();i++){
System.out.println("===========下面开始第"+(i+1)+"本书的遍历=============");
//通过 item(i)方法获取一个结点,nodelist的索引值从0开始
Node book=booklist.item(i);
//遍历book的属性
//book.getAttributes()获取book的所有的属性集合
NamedNodeMap attrs=book.getAttributes();
System.out.println("第 "+(i+1)+"本书共有"+attrs.getLength()+"属性");
for(int j=0;j<attrs.getLength();j++)
{
//获取某一属性
Node att=attrs.item(j);
//获取属性名
System.out.print("属性名:"+att.getNodeName());
//获取属性值
System.out.print(" 属性值:"+att.getNodeValue());
System.out.println(" ");
}
NodeList childnode=book.getChildNodes();
System.out.println("遍历childnode获取的每一个结点的节点名和节点值");
System.out.println("第"+(i+1)+"本书有几个子结点:"+childnode.getLength());
for(int k=0;k<childnode.getLength();k++)
{
//区分text类型的node和element类型的node
if(childnode.item(k).getNodeType()==Node.ELEMENT_NODE)
{
//注意获取结点的名称可以直接使用childnode.item(k).getNodeName()进行获取
//但是获取结点的值的时候由于element类型的返回的是null值所以我们需要获取结点的子节点的值就是结点的值即childnode.item(k).getFirstChild().getNodeValue()
//System.out.println(childnode.item(k).getNodeName()+"...."+childnode.item(k).getFirstChild().getNodeValue());
System.out.println(childnode.item(k).getNodeName()+"...."+childnode.item(k).getTextContent());
}
}
System.out.println("===========下面结束第"+(i+1)+"本书的遍历=============");
//若已经知道book结点有且只有一个id属性那么将book结点进行强制类型转换,转成Element类型的
// Element book=(Element) booklist.item(i);
// String attrvalue=book.getAttribute('id');
// System.out.println("id的属性值为"+attrvalue);
}
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
book.xml
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book id="1">
<name>冰与火之歌</name>
<author>马丁</author>
<year>2014</year>
<price>85</price>
</book>
<book id="2">
<name>斗破苍穹</name>
<year>2012</year>
<price>89</price>
<sort>1</sort>
</book>
</bookstore>