编译xml中的脚本

xml文档的内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<root>
	<name aa="sjs"/>
	<pass>sjs</pass>
	<script>
		<![CDATA[
			int a = 3;
			int b = 5;
			System.out.println("a+b= "+(a+b));
		]]>
	</script>
</root>
 

 

1.通过sax解析xml获取cdata中的脚本片段

package com.st.sax;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.Locator;
import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
import org.xml.sax.helpers.DefaultHandler;

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

public class SaxHelper  {
	
	class XMLParser extends DefaultHandler{
		//用于保存该xml文件中text值
	private StringBuffer buf;
	//用于保存临时元素的内容
	private String elementValue;
	//用于保存指定cdata元素的文本内容
	private String cdata = "";
	
	//在构造函数中初始化内容缓存
	public XMLParser() {
		super();
		buf = new StringBuffer();
		elementValue = "";
	}

	public void setDocumentLocator(Locator locator) {
		
	}

	public void startDocument() throws SAXException {
//		buf = new StringBuffer();
	}

	public void endDocument() throws SAXException {
	}

	public void startPrefixMapping(String prefix, String uri) {
	}

	public void endPrefixMapping(String prefix) {
	}

	public void processingInstruction(String target, String instruction)
			throws SAXException {
	}

	public void ignorableWhitespace(char[] chars, int start, int length)
			throws SAXException {
	}

	public void skippedEntity(String name) throws SAXException {
	}

	//一般在该方法中处理元素的属性
	public void startElement(String namespaceURI, String localName,
			String qName, Attributes atts) {
		if("script".equals(qName)){
			System.out.println("===================script node begin.");
		}
	}

	//一般在该方法中将用于保存临时元素值的变量清空,以便于保存下一个元素的内容
	public void endElement(String namespaceURI, String localName,
			String fullName) throws SAXException {
		if("name".equals(fullName)){
			elementValue = "";
		}
		if("pass".equals(fullName)){
			elementValue = "";
		}
		if("script".equals(fullName)){
			System.out.println("=====================script node end.");
			
			cdata = elementValue;
			elementValue = "";
		}
		
	}

	//处理元素的内容
	public void characters(char[] chars, int start, int length)
			throws SAXException {
		// 将元素内容累加到StringBuffer中
		buf.append(chars, start, length);
		/**
		 * 取text值需要使用临时变量,并在startElement和endElement中控制
		 */
		char[] aa = new char[length];
		System.arraycopy(chars, start, aa, 0, length);
		elementValue += new String(aa);
		System.out.println("elementValue= "+elementValue);
	}

	public String getCDATA(String node) {

		try {

			String path = "xml" +System.getProperty("file.separator")+"test.xml";
			SAXParserFactory sf = SAXParserFactory.newInstance();
			SAXParser sp = sf.newSAXParser();
			
			//如果此处的this 换成new XMLParser(),则方法后面的cdata无法取到,
			//主要是因为作用域的问题;因为该类的属性cdata无法取到(匿名类,无引用),
			//如果在try语句块中创建XMLParser sax = new XMLParser();也无法取到,原因作用域问题
			sp.parse(new InputSource(path), this);

		} catch (IOException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
		String value = cdata;
System.out.println("cdata="+cdata);
		return value;
	}
	
	
	}
	
	public String load(){
		XMLParser sax = new XMLParser();
		String aa = null;
		aa = sax.getCDATA("script");
		return aa;
		
	}
}
 

2.通过bsh工具解析脚本

 

package com.st.sax;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.Locator;
import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
import org.xml.sax.helpers.DefaultHandler;

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

public class SaxHelper  {
	
	class XMLParser extends DefaultHandler{
		//用于保存该xml文件中text值
	private StringBuffer buf;
	//用于保存临时元素的内容
	private String elementValue;
	//用于保存指定cdata元素的文本内容
	private String cdata = "";
	
	//在构造函数中初始化内容缓存
	public XMLParser() {
		super();
		buf = new StringBuffer();
		elementValue = "";
	}

	public void setDocumentLocator(Locator locator) {
		
	}

	public void startDocument() throws SAXException {
//		buf = new StringBuffer();
	}

	public void endDocument() throws SAXException {
	}

	public void startPrefixMapping(String prefix, String uri) {
	}

	public void endPrefixMapping(String prefix) {
	}

	public void processingInstruction(String target, String instruction)
			throws SAXException {
	}

	public void ignorableWhitespace(char[] chars, int start, int length)
			throws SAXException {
	}

	public void skippedEntity(String name) throws SAXException {
	}

	//一般在该方法中处理元素的属性
	public void startElement(String namespaceURI, String localName,
			String qName, Attributes atts) {
		if("script".equals(qName)){
			System.out.println("===================script node begin.");
		}
	}

	//一般在该方法中将用于保存临时元素值的变量清空,以便于保存下一个元素的内容
	public void endElement(String namespaceURI, String localName,
			String fullName) throws SAXException {
		if("name".equals(fullName)){
			elementValue = "";
		}
		if("pass".equals(fullName)){
			elementValue = "";
		}
		if("script".equals(fullName)){
			System.out.println("=====================script node end.");
			
			cdata = elementValue;
			elementValue = "";
		}
		
	}

	//处理元素的内容
	public void characters(char[] chars, int start, int length)
			throws SAXException {
		// 将元素内容累加到StringBuffer中
		buf.append(chars, start, length);
		/**
		 * 取text值需要使用临时变量,并在startElement和endElement中控制
		 */
		char[] aa = new char[length];
		System.arraycopy(chars, start, aa, 0, length);
		elementValue += new String(aa);
		System.out.println("elementValue= "+elementValue);
	}

	public String getCDATA(String node) {

		try {

			String path = "xml" +System.getProperty("file.separator")+"test.xml";
			SAXParserFactory sf = SAXParserFactory.newInstance();
			SAXParser sp = sf.newSAXParser();
			
			//如果此处的this 换成new XMLParser(),则方法后面的cdata无法取到,
			//主要是因为作用域的问题;因为该类的属性cdata无法取到(匿名类,无引用),
			//如果在try语句块中创建XMLParser sax = new XMLParser();也无法取到,原因作用域问题
			sp.parse(new InputSource(path), this);

		} catch (IOException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
		String value = cdata;
System.out.println("cdata="+cdata);
		return value;
	}
	
	
	}
	
	public String load(){
		XMLParser sax = new XMLParser();
		String aa = null;
		aa = sax.getCDATA("script");
		return aa;
		
	}
}

 输出结果:

cdata=
   
       
            int a = 3;
            int b = 5;
            System.out.println("a+b= "+(a+b));
       
   
a+b= 8

你可能感兴趣的:(xml,脚本)