Java学习笔记之Xml

7.Xml

Xml
====================================
  * 可扩展的标记语言
  * 结构化的数据
  * 不用来展示数据
  * 作用:
        *)存储数据
        *)传输数据


Xml 语法
====================================
  1.头标签
    <?xml version="1.0" encoding="GBK"?>

      必须是第一个字节

  2.根元素,只能有一个

  3.元素必须有结束标签

      <a> </a>

      <a />

  4.元素必须正确嵌套

      <a>
          <b>
          </b>
      </a>

  5.属性,必须有值
  6.属性值,必须有引号

      <a k1="v'1" k2='v"2' k3="v3">

  7.转义实体

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

  8.<![CDATA[...]]>

      计算机提取cdata块中的文本时,
      不做任何运算处理,所有字符
      作为普通字符提取出来

  9.<!--  注释  -->







标签 Tag
=====================================
  * 一对尖括号

      <a>   a的开始标签

      </a>  a的结束标签


元素 Element
=====================================
  * 包含从开始标签到结束标签全部内容

      to元素:

      <to>
            <to-email>bbb@bbb.com</to-email>
            <to-email>ccc@ccc.com</to-email>
            <to-email>ddd@ddd.com</to-email>
        </to>


文本 Text
=====================================
  * 开始标签和结束标签之间的文本内容

      <a>owhgoshdofwheowong</a>


属性 Attribute
=====================================
  * 开始标签中的键值对

      <a k1="v1">







java 处理xml的API
==========================================
  * SAX
  * XML PULL







SAX
========================================
  * Simple API for XML

  * SAXParserFactory
    SAXParser
    DefaultHandler


  SAXParserFactory
  ---------------------------------
    * sax 解析器工厂对象,
      负责创建 sax 解析器

    创建对象
    -------------------------------
      SAXParserFactory f =
        SAXParserFactory.newInstance();

    方法
    -------------------------------
      newSAXParser()

        新建解析器对象



  SAXParser
  ---------------------------------------
    方法
    --------------------------------
      parse(文件, 数据处理器)

          读取并从文件提取数据,
          将数据传递到处理器进行处理


  DefaultHandler
  --------------------------------------
    * 数据处理器父类

    方法
    ---------------------------------
      startElement()
      endElement()
      characters()







XML PULL
=============================================
  * 第三方开源 API
  * Android 开发库中,集成了 Xml pull

  * XmlPullParserFactory
    Xml
    XmlPullParser
    XmlSerializer



  XmlPullParserFactory
  ----------------------------------------
    * 用来创建解析器对象,
      和序列化器对象的工厂

    创建对象
    -------------------------------------
      XmlPullParserFactory f
        XmlPullParserFactory.newInstance();

    方法
    -------------------------------------
      newXmlPullparser()
      newXmlSerializer()


  Xml
  -------------------------------------
    * 代替工厂的辅助工具类

    方法
    ---------------------------------
      Xml.newXmlPullparser()
      Xml.newXmlSerializer()


  XmlPullparser
  -----------------------------------------
    * 解析器,用来读取、解析 xml 文档

    方法
    ------------------------------------
      setInput(Reader in)
      setInput(InputStream in, String encoding)
        设置输入流,
        从指定的流,读取 xml 数据

        必须首先调用

      next()
        跳到下一段,返回表示数据类型的整数代码

        结束后,再向后跳,返回 XmlPullParser.END_DOCUMENT = 1

      getEventType()
        返回当前位置的数据类型代码

      getName()
        获得标签名

        数字类型代码是:
            XmlPullParser.START_TAG
            XmlPullParser.END_TAG
        才能调用

      getText()
        获得文本

        数字类型代码是:
            XmlPullParser.TEXT
        才能调用

      nextText()
        向后跳一步,并取出文本

        数字类型代码是:
            XmlPullParser.START_TAG
        才能调用

      getAttributeCount()
        获得属性数量
      getAttributeName(index)
        获得指定位置的属性名
      getAttributeValue(index)
        获得指定位置的属性值
      getAttributeValue(namespace, name)
        根据属性名获得它对应的值
        namespace,如果没有,给null值

        数字类型代码是:
            XmlPullParser.START_TAG
        才能调用属性处理方法




  XmlSerializer
  ------------------------------------------
    * 序列化器,
      将数据变成xml格式的字符序列输出

    方法
    ------------------------------------
      setOutput(Writer out)
      setOutput(OutputStream out, String encoding)
        设置用来输出数据的输出流

        必须首先调用

      startDocument(字符编码, 是否独立文件)
        输出 xml 头标签
        <?xml version="1.0"
              encoding="GBK"
              standalone="yes"?>

      startTag(namespace, name)
        输出开始标签
      attribute(namespace, name, value)
        输出属性
      text(String text)
        输出文本
      endTag(namespace, name)
        输出结束标签

      cdsect(String text)
        输出 <![CDATA[]]> 块
      comment(String text)
        输出 <!--  注释  -->




XML解析:
 SAX解析
 DOM解析
   把整篇文档都读入到内存中,生成一个dom树对象。
   [Document对象],我们可以使用各种dom操作相关
   的API方法解析xml文档中的数据。
 PULL解析
   流式解析,边读取边解析。
   当读取的过程中遇到了解析事件,那么将会执行
   我们所编写的解析代码获取相应数据,然后继续
   向后驱动事件,继续解析后续文档。
   

解析特点:
1>有时候需要解析一篇完整文档。
2>有时候只需要获取文档中的一小部分数据。
3>有时候文档数据量很大
4>有时候文档的数据量不大




使用dom4j.jar文件 解析xml文档

常用API:
SAXReader reader;
  reader.read();
Document
  getRootElement()
Element
  getName()
  getText()
  elements()
  elements("book")
  getAttibuteValue()
  ......


private void parseXML_DOM4J() throws Exception {
//1 导入jar包
//2 获取Document文档对象 封装整篇xml
SAXReader reader = new SAXReader();
//以流的方式读取assets目录下的内容
InputStream is = getAssets().open("books.xml");
Document doc = reader.read(is);
//3 使用document的方法 解析文档
//获取根元素
Element root = doc.getRootElement();
//获取books元素的所有子元素
List<Element> eles = root.elements();
//遍历所有子元素
for(Element e : eles){
//每一个e 描述了一个book元素
Log.i("info", "标签名:"+e.getName()+" 属性:"+e.attributeValue("lang"));
//获取book元素中的所有子元素
List<Element> es = e.elements();
for(Element c : es){
Log.i("info", "标签名:"+c.getName() + "标签内容:"+c.getText());
}
}
}




使用Pull的方式解析XML
 流式解析,边读取边解析。
 当读取的过程中遇到了解析事件,那么将会执行
 我们所编写的解析代码获取相应数据,然后继续
 向后驱动事件,继续解析后续文档。

使用pull解析的方式在整个解析过程中将会遇到
很多的解析事件:
 XmlParser.START_DOCUMENT  遇到了文档开始
 XmlParser.END_DOCUMENT    遇到了文件结束
 XmlParser.START_TAG       遇到了开始标签
 XmlParser.END_TAG         遇到了结束标签
 

实现步骤:
XmlPullParser parser=Xml.newPullParser();
parser.setInput(is, "utf-8");
int event=parser.getEventType();
while(event!=XmlPullParser.END_DOCUMENT){
  switch(event){
   case  XmlParser.START_DOCUMENT  遇到了文档开始
   case  XmlParser.START_TAG       遇到了开始标签
    if(tag == "name"){}
    else if(tag == "book"){}
    ......
   case  XmlParser.END_TAG         遇到了结束标签
  }
  //向后继续驱动事件 解析后续文档内容
  event=parser.next();
}


private void parseXML_PULL()throws Exception{
XmlPullParser parser = Xml.newPullParser();
InputStream is = getAssets().open("books.xml");
parser.setInput(is , "utf-8");
//获取事件类型
int event = parser.getEventType();
List<Book> books = new ArrayList<Book>();
Book book = null;
while(event != XmlPullParser.END_DOCUMENT){
//解析当前事件
switch (event) {
case XmlPullParser.START_DOCUMENT:
break;
case XmlPullParser.START_TAG:
String tag = parser.getName(); //标签名
if(tag.equals("book")){ //碰到了book
book = new Book();
}else if(tag.equals("name")){ //碰到了name
book.setName(parser.nextText());
}else if(tag.equals("isbn")){ //碰到了isbn
book.setIsbn(parser.nextText());
}else if(tag.equals("author")){ //碰到了author
book.setAuthor(parser.nextText());
}else if(tag.equals("price")){ //碰到了price
book.setPrice(parser.nextText());
}else if(tag.equals("publish_time")){ //碰到了publish_time
book.setPublishTime(parser.nextText());
}else if(tag.equals("description")){ //碰到了description
book.setDescription(parser.nextText());
}
break;
case XmlPullParser.END_TAG:
tag = parser.getName();
if(tag.equals("book")){
books.add(book);
}
break;
}
//继续向后驱动事件 解析后续文档
event = parser.next();
}
Log.i("info", ""+books);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
文件上传是Web开发中常见的功能之一,Java中也提供了多种方式来实现文件上传。其中,一种常用的方式是通过Apache的commons-fileupload组件来实现文件上传。 以下是实现文件上传的步骤: 1.在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.3</version> </dependency> ``` 2.在前端页面中添加文件上传表单: ```html <form method="post" enctype="multipart/form-data" action="upload"> <input type="file" name="file"> <input type="submit" value="Upload"> </form> ``` 3.在后台Java代码中处理上传文件: ```java // 创建一个DiskFileItemFactory对象,用于解析上传的文件 DiskFileItemFactory factory = new DiskFileItemFactory(); // 设置缓冲区大小,如果上传的文件大于缓冲区大小,则先将文件保存到临时文件中,再进行处理 factory.setSizeThreshold(1024 * 1024); // 创建一个ServletFileUpload对象,用于解析上传的文件 ServletFileUpload upload = new ServletFileUpload(factory); // 设置上传文件的大小限制,这里设置为10MB upload.setFileSizeMax(10 * 1024 * 1024); // 解析上传的文件,得到一个FileItem的List集合 List<FileItem> items = upload.parseRequest(request); // 遍历FileItem的List集合,处理上传的文件 for (FileItem item : items) { // 判断当前FileItem是否为上传的文件 if (!item.isFormField()) { // 获取上传文件的文件名 String fileName = item.getName(); // 创建一个File对象,用于保存上传的文件 File file = new File("D:/uploads/" + fileName); // 将上传的文件保存到指定的目录中 item.write(file); } } ``` 以上代码中,首先创建了一个DiskFileItemFactory对象,用于解析上传的文件。然后设置了缓冲区大小和上传文件的大小限制。接着创建一个ServletFileUpload对象,用于解析上传的文件。最后遍历FileItem的List集合,判断当前FileItem是否为上传的文件,如果是,则获取文件名,创建一个File对象,将上传的文件保存到指定的目录中。 4.文件上传完成后,可以给用户一个提示信息,例如: ```java response.getWriter().write("File uploaded successfully!"); ``` 以上就是使用Apache的commons-fileupload组件实现文件上传的步骤。需要注意的是,文件上传可能会带来安全隐患,因此在处理上传的文件时,需要进行严格的校验和过滤。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值