📄 stanzaparserutf8.java
字号:
/**
* Copyright ©? 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 + -