XML

来源:互联网 发布:淘宝刷单任务平台源码 编辑:程序博客网 时间:2024/05/21 17:46
什么是XML(Extensible Markup Language)
可扩展标记语言。目前推荐遵循W3C组织发布的XML1.0规范。


技术原由:在现实生活中大量存在关系的数据。
这样的数据如何交给计算机处理:
XML常见应用:
 XML技术除用于保存有关系 的数据之外,它还经常用作软件配置文件,以描述程序模块之间的关系。
 在一个软件系统中,为提高系统的灵活性,它所启动的模块通常由其配置文件决定 。
 例如:软件启动时,要启动A,B两个模块,而A,B在启动时又分别要启动A1,A2,B1,B2这两个模块。
 为了准备描述这种关系,此时使用XML文件最适合不过。
 
一个XML文件分为如下几个部分内容:
 1.文档声明:
 2.元素
 3.属性
 4.注释
 5.CDATA区,特殊字符
 6.处理指令(processing instruction)
1.文档声明:在编写XML文档时,需要先使用文档声明:
  1.最简单的文档声明语句:<? xml version="1.0"?>
  2.设置文档的编码格式:encoding="utf-8"
  注意这里的乱码原由:记事本保存默认是GB2323的模式。如果xml指定的是UTF-8那么就会有编码冲突。
  eclipse有自动识别保存文件格式。
  3.设置文档是否独立:standalone="no"//IE不关注这个属性。
2.元素:
   1.XML文件中出现的标签,一个标签分为开始标签和一个结束标签。
        一个标签有几种如下书写格式。
  包含标签体:<a>www.baidu.com</a>
  不包含标签体:<a></a>
  2.一个标签也可以嵌套若干子标签,但不能交叉标签。
  3.格式良好的XML文档必须有且仅有一个根标签,其它标签都是这个根标签的子孙标签。
  4.对于XML标签中出现的所有空格和换行,XML解析程序会当作标签内容处理。
  5.命名规范1.区分大小写,不能数字开头_开头不能XML开头不能有空格中间不能有:号。  
3.属性:
  1.一个标签可以有多个属性,每个属性都有它自己的名称取值。<input name = "text">
  2.属性值一定要用双引号或单引号(’)引起来。
  3.定义属性必须遵循与标签相同的命名规范。
  4.XML技术中,标签属性所代表的信息,也可以被改成子元素的形式来描述,例如:
   <input>
     <name>tom</name>
   </input>
4.注释:
  XML文件的注释采用:<!---注释--->格式
  注意: 1.XML声明之前不能有注释 2.注释不嵌套。
   
5.CDATA区:
  1.在编写XML文件时,有些内容可能不想让解析引擎解析执行,而是当作原始数据内容处理。
  2.遇到这种情况,可以把这些内容放在CDATA区里。
  语法: <![CDATA[内容]]>
  示例: <![CDATA[
          <A>
            <B></B>
          </A> 
          ]]> 
6.处理指令:
  处理指令,简称PI(processing instruction).处理指令用来指挥解析引擎如何解析XML文档内容。
  例如,在XML文档中可以使用XML-stylesheet指令,通知解析引擎应用css文件显示XML文档。
  <?xml-stylesheet type="text/css" href="1.css" ?>
  处理指令必须以<?作为开头,以“?>”作为结尾,XML声明语句就是最常见的一种处理指令。
  
 
7.XML约束:
 在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束。
 为什么需要XML约束
 常用的约束技术: XML DTD/XML schema
 IE5以上浏览器内置了XML解析工具:Microsort.XMLDOM开发人员可以编写javascritp代码,利用这个解析工具装载XML文件,并对XML文件进行dtd验证。
 常用方法是用eclipse检验dtd是否正确。
 
8.DTD语法:
  1.DTD的引用:1.本地的引用:<!DOCTYPE 文档根节点 SYSTEM "dtd文件的URL">
               2.公共的文件时:<!DOCTYPE 文档根节点 PUBLIC "dtd名称" "dtd的URL">
  2.元素定义:1.格式如下<!ELEMENT 元素名称 元素类型>
              2.元素类型可以是元素内容或类型
                如<!ELEMENT 书架 (书名,作者,售价)>
                  <!ELEMENT 书名(#PCDATA)>
              3.如为元素类型,则直接书写DTD规范定义了如下几种类型:
                EMPTY:用于定义空元素。<br/><hr/>
                ANY:表示元素内容为任意类型。
              4.用逗号分隔,表示内容的出现顺序必须与声明时一致。
              5.用|分隔,表示任选其一,即多个只能出现一个
              5.+:一次多多次 ?:0次或一次 *:0次或多次。
              6.也可以使用圆括号()批量设置
                例:<!ELEMENT MYFILE((TITLE*,AUTHOR?,EMAIL)*|COMMENT)>
  
  3.属性定义:1.xml文档中的标签属性通过ATTLIST为其设置属性
      2.语法格式:
       <!ATTLIST 元素名 属性名 属性值类型 设置说明>
       例:<!ATTLIST 商品 类别 CDATA #REQUIRED 
                          着色 CDATA #IMPLIED(可选的)>
                          作者 CDATA #FIXED(固定) "给定值">
      3.常用属性类型:CDATA (字符串) ENUMERATED
       ID(必须以字母开头)   ENTITY(实体:相当于变量)
       ENTITY:1.引用实体:引用实体主要是在XML文档中应用
          例:<!ENTITY 实体名称 “实体内容” >:直接转变成实体内容。
          2.引用方法:&实体名称;
            例:<!ENTITY copyright "I AM A PROGRAMMER">
            &copyright;
            3.参数实体:DTD文件自身使用:
              语法格式:<!ENTITY % 实体名称 “实体内容”>
              引用方式:%实体名称 
4.XML编程:XML解析技术概述: dom和sax
  1.dom:(W3C)组织提供的一个方式。
  2.sax(simple API for XML)不是官方标准,但它是XML社区事实上的标准,基本所有的XML解析器都支持它。
  XML解析开发包。Jaxp(sun) Jdom dom4j
  两者比较:1.dom解析的优点是对文档crud比较方便,缺点是占内存比较大。
            2.sax解析的优点是占用内存少,解析速度快,缺点是不适合做文档的crud.
  虚拟机内存大小的调整: argument里用Xmx80m
  
JAXP:JAXP开发包是j2se的一部分,它由javax.xml.org.w3c.dom/org.xml.sax包和子包组成。
在javax.xml.parsers包中,定义了几个工厂类,程序员调用这些工厂类,可以得到XML文档的DOM或SAX解析器。
从而实现对xml文档的解析。
 
javax.xml.parsers包中 DocumentBuilderFactory用于创建DOM模式的解析器对象,DocumentBuilderFacory是一个抽象工厂类,它不能直接实例化
  但类的一个newInstance方法,可以根据本地平台默认安装解析器,自动创建一个工厂的对象并返回。
  public void test() throws Exception{
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
   DocumentBuilder db = dbf.newDocumentBuilder();
   Document d = db.parse("src/book.xml");
   NodeList list = d.getElementsByTagName("书名");
   Node node = list.item(0);
   String str = node.getTextContent();
Element el = (Element) d.getElementsByTagName("书名").item(0);
        String arr = el.getAttribute("name");
   System.out.println(str + arr);
}
  
  javax.xml.transfrom包中的Transformer类用于把找表XML文件的Document对象转的成某种格式后进行输出,例如把XML文件应用样转成HTML文档。
  利用这个对象,当然也可以把Document对象又重新写到一个XML文件中。
  Transformer类通过transform方法完成转的操作,该方法接收一个源和一个目的地。我们可以通过:
  1.javax.xml.transform.dom.DOMSource类来关联要转的document对象。
  2.javax.xml.transform.stream.StreamResult对象来表示数据的目的地。
  Transform对象通过TransformerFactory获得。
  示例:
  TransformerFactory tf = TransformerFactory.newInstance();
Transformer tfr = tf.newTransformer();
tfr.transform(new DOMSource(d),new StreamResult(new FileOutputStream("src/book.xml")));


SAX采用事件处理的方式解析XML文件,利用SAX解析XML文档,文档分两个部分内容:
  解析器和事件处理器:
  1.解析器可以使用JAXP的API创建,创建出SAX解析器事,就可以指定解析器去解析某个XML文档。
  2.解析器采用SAX方式 在解析某个XML文档时,它只要解析到XML文档的一个组成 部分,都会去调味用事件处理器的一个方法,
   解析器在调用事件处理器的方法时,会把当前解析到的XML文件内容作为方法的参数传递给处理器。
  3.事件处理器由程序员编写,程序员通过事件处理器中的方法参数,就可以很轻松地得到SAX
    解析到的数据,从而可以决定如果处理数据。
  流程:SAXParser--->SAXParser-->SAXRreader(Hander)
  常用方法: startElement/endElement/charactors.
  示例:
  public class DomeSax {


public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
//获取工厂
SAXParserFactory sf = SAXParserFactory.newInstance();
//获取解析器
SAXParser sp = sf.newSAXParser();
//获取读取器
XMLReader reader = sp.getXMLReader();
//设置内容处理器
reader.setContentHandler(new ListHandler());
//读取XML文档
reader.parse("src/book.xml");
}
}


class ListHandler extends DefaultHandler{
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
System.out.println("<" + qName + ">");
for(int i=0;i<attributes.getLength() && attributes!=null;i++){
String name = attributes.getQName(i);
String value = attributes.getValue(i);
System.out.println("name " + name + "value" + value);
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
System.out.println(new String(ch,start,length));
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
System.out.println("</" + qName +">");
}
}


DOM4J解析XML文档:(非常好的API文档查档)
 1.Dome4j是一个简单、灵活的开源代码的库。DOM4J是由JDOM开发的人分离出来后独立开发的。
 和JDOM不同的是,DOM4J使用接口和抽象类,虽然比JDOM更复杂一点,也它更灵活。
 2.DOM4J是一个非常优秀的JAVA XML API ,具有性能优异,功能强大和极易使用的特点。现在很多软件都采用。
 3.使用DOM4J,要下载相应的jar文件。
 示例:
  @Test
public void test() throws DocumentException{
 SAXReader reader = new SAXReader();
 Document document = reader.read("src/book.xml");
 Element root = document.getRootElement();
 Element book = (Element) root.elements("??").get(0);
 String bookname = book.element("????").getText();
 String bookattr = book.element("????").attributeValue("name");
 System.out.println(bookname);
 System.out.println(bookattr);
}

@Test
public void test2() throws DocumentException, IOException {
SAXReader reader = new SAXReader();
Document document = reader.read("src/book.xml");
Element root = document.getRootElement();
Element book = root.element("书");
book.addElement("出版日期").addAttribute("time", "1929-2-10");
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("utf-8");
XMLWriter writer = new XMLWriter(new FileOutputStream("src/book.xml"),format);
writer.write(document);
writer.close();
}
@Test
public void test3() throws DocumentException, IOException {
SAXReader reader = new SAXReader();
Document document = reader.read("src/book.xml");
Element time = document.getRootElement().element("书").element("出版日期");
time.getParent().remove(time);
XMLWriter writer = new XMLWriter(new FileOutputStream("src/book.xml"));
writer.write(document);
writer.close();
}
@Test
public void test4() throws DocumentException, IOException {
SAXReader reader = new SAXReader();
Document document = reader.read("src/book.xml");
Element time = document.getRootElement().element("书");
Element price = DocumentHelper.createElement("售价");
price.setText("203");
time.add(price);
XMLWriter writer = new XMLWriter(new FileOutputStream("src/book.xml"));
writer.write(document);
writer.close();
}

乱码问题分析:FileWriter是一个字符流所以传输时会不查码表,用平台默认码表,这时。我们可以用FileOutputStream
再加上一个格式化输出器。就可以控制码表的输出的格式。
解决办法:很简单把工程设置编码格式再把XML编码格式设置统一。

XPATH:用来定位节点。非常实用。API非常好。查档。注意这里要有支持的jar。

XML Schema:
XML Schema也是一种定义和描述XML文档与内容的模式语言,其出现是为了克服DTD的局限性。
XML vs DTD:
1.xml Schema符合XML语法结构拓展名.xsd:
2.DOM,SAX等XML API很容易解析出XML Schema文档中的内容。
3.XML Schema对名称空间支持很好。
3.Schema比DTD支持更多的数据类型,并支持用户自定义的数据类型。
4.Schema不能像DTD一样定义实体,比DTD更复杂,它是W3C的标准,正取代DTD。
5.一个XML Schema文档通常称之为模式文档,遵循这个文档书写的叫实例文档。
6.Schema 必须有一个根节点。这个根节点名称为Schema。
7.Schema约束文档编写完后。通常要把这个文件中声明的元素绑定到一个uri地址上,
  专业术语叫绑定到名称空间上。以后实例文档就可以从uri上来告诉引擎,实例文档
  中的xml元素来自哪里让谁约束。
具体语法内容参考:xsd文档。
0 0