Java核心技术II读书笔记(三)

ch2 XML

SAX解析器

SAXParserFactory factory = SAXParserFactory.newInstance();

SAXParser parser = factory.newSAXParser();    //建立SAX解析器对象

parser.parse(source,handler);  //source可以是文件,URL或者字符串输入流,handle是DefaultHandler的子类

DefaultHandler handler = new 
    DefaultHandler(){
         public void startElement(String namespaceURI,String lname,String qname, Attributes attrs) throws SAXException{
              if(lname.equalsIngoreCase("a")&&attrs!=null){
                  for(int i=0;i<attrs.getLength();i++){
                       String aname = attrs.getLocalName(i);
                       if(aname.equalsIgnoreCase("href"))
                           System.out.println(attrs.getValue(i));
                  }
              }
         }          
    };        

其中qname参数是prefix:localname这种形式。如果命名空间处理特性打开,那么namespaceURI和lname描述的就是命名空间和本地(非限定)名。
与DOM一样,命名空间默认是关闭的,调用工厂类的setNamespaceAware方法激活:

SAXParserFactory factory = SAXParserFactory.newInstnce();

factory.setNamespaceAware(true);

SAXParser saxParser = factory.newSAXParser();

备注:XHTML文件总是以一个DTD引用标签开头,W3C也不情愿提供千万亿次的下载,如果自己不需要验证文件,只需调用:

factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd",false);

StAX解析器

3 import java.io.*;
4 import java.net.*;
5 import javax.xml.parsers.*; 6 import org.xml.sax.*; 7 import org.xml.sax.helpers.*; 89 /** 10 * This program demonstrates how to use a SAX parser. The program prints all hyperlinks of an 11 * XHTML web page.<br> 12 * Usage: java SAXTest url 13 * @version 1.00 2001-09-29 14 * @author Cay Horstmann 15 */ 16 public class SAXTest 17 { 18 public static void main(String[] args) throws Exception 19 { 20 String url; 21 if (args.length == 0) 22 { 23 url = "http://www.w3c.org"; 24 System.out.println("Using " + url); 25 } 26 else url = args[0]; 27 28 DefaultHandler handler = new DefaultHandler() 29 { 30 public void startElement(String namespaceURI, String lname, String qname, 31 Attributes attrs) 32 { 33 if (lname.equals("a") && attrs != null) 34 { 35 for (int i = 0; i < attrs.getLength(); i++) 36 { 37 String aname = attrs.getLocalName(i); 38 if (aname.equals("href")) System.out.println(attrs.getValue(i)); 39 } 40 } 41 } 42 }; 43 44 SAXParserFactory factory = SAXParserFactory.newInstance(); 45 factory.setNamespaceAware(true); 46 factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); 47 SAXParser saxParser = factory.newSAXParser(); 48 InputStream in = new URL(url).openStream(); 49 saxParser.parse(in, handler); 50  } 51 }

生成XML

不带命名空间的文档:

Document doc = builder.newDocument();  //创建一个空文档

Element rootElement = doc.createElement(rootName);  //创建文档元素

Element childElement = doc.createElement(childName);

Text textNode = doc.createTextNode(textContents);  //创建文本节点

doc.appendChild(rootElement);   //创建跟节点

rootElement.appendChild(childElement);  //创建子节点

childElement.appendChild(textNode);   //创建文本值

rootElement.setAttribute(name,value);  //创建元素属性

带命名空间的文档:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

factory.setNamespaceAware(true);

builder = factory.newDocumentBuilder();

String namespace = "http://www.w3.org/2000/svg";

Element rootElement = doc.createElementNS(namespace,"svg"); //创建文档元素

Element svgElement = doc.createElement(namespace,"svg:svg");  //带命名空间前缀的写法

rootElement.setAttributeNS(namespace,qualifiedName,value);

 ----------------------------------------------------------------

XML DOM输出
方式1

Transformer t = TransformerFactory.newInstance().newTransformer();   //这玩意干嘛的?从源到结果的转换API

t.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM,systemIdentifier);

t.setOutputProperty(Outputkeys.DOCTYPE_SYSTEM,publicIdentifier);

t.setOutputProperty(OutputKeys.INDENT,"yes");

t.setOutputProperty(OutputKeys.METHOD,"xml");

t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount","2");

t.transform(new DOMSource(doc),new StreamResult(new FileOutputStream(file)));  //执行上面的设置并且输出到文件中

方式2 LSSerializer

DOMImplementation impl = doc.getImplementation();

DOMImplementationLS implLS = (DOMImplementationLS) impl.getFeature("LS","3.0");

LSSerializer ser = implLS.createLSSerializer();

ser.getDomConfig().setParameter("format-pretty-print",true);  //设置空格和换行

String str = ser.writeToString(doc);  //将文档转换为字符串

LSOutput out = implLS.createLSOutput();  

out.setEncoding("UTF-8");

out.setByteStream(Files.newOutputStream(path));

ser.write(doc,out);  //将输出写入文件中

 方式3 StAX

XMLOutputFactory factory = XMLOutputFactory.newInstance();

XMLStreamWriter writer = factory.createXMLStreamWriter(out);

接着是一系列的按XML顺序从上到下的操作,如:

产生XML文件头  writer.writeStartDocument();

添加子节点  writer.writeStartElement(name);

...

 

转载于:https://www.cnblogs.com/runwulingsheng/p/5439491.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值