13,100
社区成员
发帖
与我相关
我的任务
分享
private void parseAttribute(int start, int end)
{
if (end > start && attribute == null)
{
attribute = new Hashtable<String, String>();
int skip = start;
int skip2 = start;
String name, value;
while (true)
{
skip = str.indexOf('"', start);
skip2 = str.indexOf("'", start);
if ((skip2 > start && (skip < 0) || (skip2 < skip && skip2 > 0)))
{
skip = skip2;
skip2 = str.indexOf("'", skip + 1);
}
else if (skip > start)
{
skip2 = str.indexOf('"', skip + 1);
}
if (skip > start && skip2 > skip && skip2 < end)
{
name = str.substring(start, skip - 1);
if (name != null && name.length() > 0)
{
name = name.trim();
value = str.substring(skip + 1, skip2);
start = skip2 + 1;
if (value != null)
{
value = value.trim();
}
attribute.put(name, value);
}
}
else
{
break;
}
}
}
}
/**
* 解析文本内容
*
* @param start
*/
private void parseContent(int start, int next)
{
content = str.substring(start, next);
if (content != null)
{
content.trim();
}
}
/**
* 解析子节点结束位置
*
* @param start
* @return
*/
private int parseChildrenEnd(int start)
{
int end = str.indexOf("/>", start);
int skip = str.indexOf('<', start + 1);
if (end > 0 && (skip < 0 || skip > end)) // 没有子节点了
{
return end + 2;
}
else
{
int idx1 = 0;
int idx2 = 0;
skip = start;
// 还有下级子节点
int skip1 = 0;
int skip2 = 0;
while (skip < str.length())
{
skip1 = str.indexOf('<', skip);
skip2 = str.indexOf('>', skip1);
char nextSkip1 = str.charAt(skip1 + 1);
if (nextSkip1 != '!')
{
if (nextSkip1 == '/')
{
idx1--;
}
else if (str.charAt(skip2 - 1) != '/')
{
idx1++;
}
}
else
{
skip2 = str.indexOf("-->", skip1);
skip = skip2;
continue;
}
if (idx2 >= idx1)
{
return skip2 + 1;
}
if (skip2 > skip1 && skip1 > 0)
{
skip = skip2;
}
else
{
return 0;
}
}
}
return 0;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#toString()
*/
public String toString()
{
StringBuffer buff = new StringBuffer();
buff.append('<');
buff.append(root);
if (attribute != null)
{
Enumeration<String> names = attribute.keys();
while (names.hasMoreElements())
{
String name = (String) names.nextElement();
buff.append(' ');
buff.append(name);
buff.append("=\"");
buff.append(attribute.get(name));
buff.append('"');
}
}
if (content == null && children == null)
{
buff.append("/>\n");
}
else if (children != null)
{
buff.append('>');
{
for (int i = 0; i < children.size(); i++)
{
buff.append(children.elementAt(i).toString());
}
}
buff.append("\n</");
buff.append(root);
buff.append('>');
}
else if (content != null)
{
buff.append(">\n");
buff.append(content);
buff.append("\n</");
buff.append(root);
buff.append('>');
}
return buff.toString();
}
}
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;
public class XmlParse
{
/**
* 子节点列表<Xml>
*/
public Vector<XmlParse> children = null;
/**
* xml字符串
*/
public String str;
/**
* xml根节点
*/
private String root = null;
/**
* xml文本内容
*/
private String content = null;
/**
* 属性列表<String[] {"name", "value"}>
*/
public Hashtable<String, String> attribute = null;
public XmlParse(String xmlString)
{
if (xmlString != null && xmlString.length() > 1)
{
this.str = xmlString;
try
{
parse(0);
}
catch (Exception e)
{
e.printStackTrace();
}
// this.str = null;
}
}
/**
* 读取xml根名称
*
* @return
*/
public String getName()
{
return this.root;
}
/**
* 读取xml文本内容
*
* @return
*/
public String getText()
{
return content;
}
/**
* 读取属性值
*
* @param name
* 属性名
* @return
*/
public String getAttribute(String name)
{
if (attribute == null)
{
return null;
}
return (String) attribute.get(name);
}
/**
* 获得字节点列表
*
* @return
*/
public Vector<XmlParse> getChildren()
{
return children;
}
/**
* 解析Xml
*
* @param data
* 数据源
* @return
*/
private void parse(int skip)
{
skip = str.indexOf('<', skip) + 1;
if (skip < 0)
{
return;
}
char fiter = str.charAt(skip);
if (fiter == '!')
{
skip = str.indexOf(">", skip);
parse(skip);
return;
}
root = parseRoot(skip);
if (root != null)
{
skip += root.length();
int end = str.indexOf('>', skip);
int finish = str.length();
if (end >= skip)
{
parseAttribute(skip + 1, end);
if (str.charAt(end - 1) != '/')
{
int next = end + 1;
while (next < finish)
{
skip = next;
next = str.indexOf('<', skip);
if (next < 0)
{
return;
}
else if (str.charAt(next + 1) == '/')
{
parseContent(skip, next);
return;
}
else
{
end = parseChildrenEnd(next);
if (end > 0)
{
String xmlString = str.substring(next, end);
XmlParse child = new XmlParse(xmlString);
if (children == null)
{
children = new Vector<XmlParse>();
}
children.addElement(child);
}
else if (end == 0)
{
return;
}
next = end;
}
}
}
}
}
}
/**
* 读取根节点
*
* @param skip
* @return
*/
private String parseRoot(int skip)
{
char ch = 0;
for (int i = skip; i < str.length(); i++)
{
ch = str.charAt(i);
if (ch == ' ' || ch == '>')
{
return str.substring(skip, i);
}
}
return null;
}