⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stanzaparserutf8.java

📁 XML 解释器(字符串变量): 通常的XML解释
💻 JAVA
字号:
/** 
* Copyright &#169? 2006 广州乐言信息科技有限公司. 
* All right reserved. 
* Created at 2006-8-18
*/ 

package com.hiany.xml;

import java.util.Iterator;

import org.apache.log4j.Logger;

/**
 * XML节点的解析器,针对标准的UTF-8字符串
 */
public class StanzaParserUtf8 implements StanzaParser {
	static Logger logger = Logger.getLogger(StanzaParserUtf8.class);

	/* (non-Javadoc)
	 * @see com.hiany.xml.StanzaParser#parse(java.lang.StringBuffer)
	 */
	public Stanza parse(StringBuffer sb) {
		logger.debug("str:" + sb);
		if (sb.length() <= 3) {
			return null;
		}

		int p1 = sb.indexOf("<");
		if (p1 < 0) {
			return null;
		}
		int p2 = sb.indexOf(">", p1);
		if (p2 < p1) {
			return null;
		}

		// 前半段,从 '<'到第一个'>'(不含)
		String frontStr = sb.substring(p1 + 1, p2).trim();
		if (frontStr.length() < 1) {
			return null;
		}

		Stanza stanza = new Stanza();
		if (frontStr.substring(0, 1).equals("/")) {
			// 第一个字符是'/':两段式<name >text</name>的后半部分
			stanza.setClosed(true);
			stanza.setText(sb.substring(0, p1));
			frontStr = frontStr.substring(1);
		} else if (frontStr.substring(frontStr.length() - 1, frontStr.length())
				.equals("/")) { // <a
			// 最后一个字符是'/': 一段式<name />形式
			stanza.setClosed(true);
			stanza.setText("");
			frontStr = frontStr.substring(0, frontStr.length() - 1).trim();
		}

		// 取name
		int bPos = frontStr.indexOf(' ');
		if (bPos > 0) {
			stanza.setName(frontStr.substring(0, bPos));
			if (stanza.getName() != null && stanza.getName().length() > 1
					&& stanza.getName().charAt(0) == '/') { // 斜线开始则去掉
				stanza.setName(stanza.getName().substring(1));
			}

			frontStr = frontStr.substring(bPos + 1);
		} else {
			stanza.setName(frontStr);
			frontStr = null;
		}

		// 取属性
		int pos = 0;
		if (frontStr != null && frontStr.trim().length() > 0) {
			while (pos < frontStr.length()) {
				int pos1 = frontStr.indexOf('=', pos);
				if (pos1 < 0) { // 没有‘=’,不符合规范
					break;
				}
				logger.debug("pos:" + pos);
				if (pos1 > 0) {
					String attr = frontStr.substring(pos, pos1).trim();
					// 分析属性值
					pos1++;
					logger.debug("attr:" + attr + ",pos:" + pos + ",pos1:"
							+ pos1);
					while (frontStr.charAt(pos1) == ' ')
						pos1++;

					if (frontStr.charAt(pos1) == '\'') {
						pos1++;
						int pos2 = frontStr.indexOf('\'', pos1);
						logger.debug("sQuot, pos1:" + pos1 + ",pos2:" + pos2);
						if (pos2 > pos1) {
							String val = frontStr.substring(pos1, pos2);
							stanza.setAttribute(attr, val);
							logger.debug("attr:" + attr + ",val:" + val);
							pos = pos2 + 1;
						} else {
							String val = frontStr.substring(pos1);
							stanza.setAttribute(attr, val);
							logger.debug("attr:" + attr + ",val:" + val);
							pos = frontStr.length();
						}
					} else if (frontStr.charAt(pos1) == '"') {
						pos1++;
						int pos2 = frontStr.indexOf('"', pos1);
						logger.debug("dQuot, pos1:" + pos1 + ",pos2:" + pos2);
						if (pos2 > pos1) {
							String val = frontStr.substring(pos1, pos2);
							stanza.setAttribute(attr, val);
							logger.debug("attr:" + attr + ",val:" + val);
							pos = pos2 + 1;
						} else {
							String val = frontStr.substring(pos1);
							stanza.setAttribute(attr, val);
							logger.debug("attr:" + attr + ",val:" + val);
							pos = frontStr.length();
						}
					} else {
						int pos2 = frontStr.indexOf(' ', pos1);
						logger.debug("blank, pos1:" + pos1 + ",pos2:" + pos2);
						if (pos2 > pos1) {
							String val = frontStr.substring(pos1, pos2);
							stanza.setAttribute(attr, val);
							logger.debug("attr:" + attr + ",val:" + val);
							pos = pos2 + 1;
						} else {
							String val = frontStr.substring(pos1);
							stanza.setAttribute(attr, val);
							logger.debug("attr:" + attr + ",val:" + val);
							pos = frontStr.length();
						}
					}
				}
			}
		}

		if (stanza.isClosed()) {
			// 结束解析,把解析完的字符串部分删除。
			sb.delete(0, p2 + 1);
		} else {// 解析正文和后半段
			// 设置p3从p2开始
			int p3 = p2;
			do {
				p3 = sb.indexOf("<", p3 + 1);
				logger.debug("p3:" + p3);
				if (p3 > 0) {
					int p4 = sb.indexOf(">", p3 + 1);
					logger.debug("p4:" + p4);
					if (p4 > 0) {
						String backStr = sb.substring(p3 + 1, p4).trim();
						logger.debug("backStr:" + backStr);
						if (backStr.substring(0, 1).equals("/")
								&& backStr.substring(1).trim().equals(
										stanza.getName())) {
							stanza.setClosed(true);
							stanza.setText(sb.substring(p2 + 1, p3));
							// 结束解析,把解析完的字符串部分删除。
							sb.delete(0, p4 + 1);
							break;
						} else {
							continue;
						}
					} else {// 未出现后半段,删除已解析的前半部分,暂时结束
						sb = sb.delete(0, p2 + 1);
						break;
					}
				} else {// 未出现后半段,删除已解析的前半部分,暂时结束
					sb = sb.delete(0, p2 + 1);
					break;
				}
			} while (true);
		}
		logger.debug("str:" + sb);

		return stanza;
	}

	/* (non-Javadoc)
	 * @see com.hiany.xml.StanzaParser#buildString()
	 */
	public String buildString(Stanza stanza) {
		String str = "";

		str += "<" + stanza.getName();
		Iterator itr = stanza.getAttributeNames().iterator();
		while (itr.hasNext()) {
			String attr = (String) itr.next();
			String value = stanza.getAttribute(attr);
			if (value != null) {
				str += " " + attr + "='" + value + "'";
			}
		}
		str += ">";

		if (stanza.isClosed()) { // 若已经闭合
			str += stanza.getText();
			str += "</" + stanza.getName() + ">";
		}

		return str;
	}

	/* (non-Javadoc)
	 * @see com.hiany.xml.StanzaParser#buildString(int)
	 */
	public String buildString(Stanza stanza, int part) {
		String str = "";

		if (part == Stanza.Part.FRONT) {
			str += "<" + stanza.getName();
			Iterator itr = stanza.getAttributeNames().iterator();
			while (itr.hasNext()) {
				String attr = (String) itr.next();
				String value = stanza.getAttribute(attr);
				if (value != null) {
					str += " " + attr + "='" + value + "'";
				}
			}
			str += ">";
		} else if (part == Stanza.Part.BODY) {
			str += stanza.getText();
		} else {
			if (stanza.isClosed()) { // 若已经闭合
				str += "</" + stanza.getName() + ">";
			}
		}

		return str;
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -