请教j2me中编辑xml数据问题

懒得抠虱子 2008-12-12 10:46:06
请问j2me中能用jsr172或者kxml对xml数据进行编辑吗?比如:添加、删除、修改节点。
如果可以的话应该怎么做?最好能给段代码,谢谢。
如果不行的话,是否有其他的第三方包能做到?
如果没有的话,需要自己编写相关代码,能否给点建议或思路,谢谢。
...全文
120 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
懒得抠虱子 2008-12-15
  • 打赏
  • 举报
回复
谢谢两位的回复!
yanhan0615 2008-12-15
  • 打赏
  • 举报
回复
续,tmd居然超过字符限制了

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();
}
}
yanhan0615 2008-12-15
  • 打赏
  • 举报
回复
给个实例,一年前的东东了,有问题自己改改

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;
}
yanhan0615 2008-12-15
  • 打赏
  • 举报
回复
其实如果你的xml不是很复杂的话,完全可以自己写一个解析器,核心代码不会太长的,只是要注意一下对字符串操作的效率问题
懒得抠虱子 2008-12-12
  • 打赏
  • 举报
回复
恩,谢谢 kf156

其他朋友还有其他的看法吗?或者更好的建议?
kf156 2008-12-12
  • 打赏
  • 举报
回复
如果比较复杂的操作,像对一个XML进行多处的增加删除修改操作
我觉得还是先把XML解析出来
再按要求逐个操作,保存,最后再重新组装生成新的XML
懒得抠虱子 2008-12-12
  • 打赏
  • 举报
回复
就是比较复杂,呵呵
kf156 2008-12-12
  • 打赏
  • 举报
回复
看具体情况吧,如果你的操作不复杂
也可以直接在XML字符串里找到你想增加、删除、修改的位置进行操作
比如对一个XML进行简单的修改,下边为修改title:

String xml = "<xml><head><title>标题</title></head><body><text>文字</text></body></xml>";
int m = xml.indexOf("<title>");
int n = xml.indexOf("</title>");
String title = "新标题";
String newXml = xml.substring(0,m) + "<title>" + title+ xml.substring(n, xml.length());
System.out.println(newXml);

你可以将增加、删除、修改分别写成相应的方法,以便调用。
懒得抠虱子 2008-12-12
  • 打赏
  • 举报
回复
谢谢楼上的回复,是不是只有这个办法呢?
kf156 2008-12-12
  • 打赏
  • 举报
回复
用KXML解析XML,能得到所有的标记名称、属性、内容。
那么你只要找到你想添加、删除、修改的位置,做相应操作,再重新组装起来就行了。
下边的这段代码为解析XML并重新输出在控制台。


KXmlParser parser = new KXmlParser();
parser.setInput(is); //is为XML输入流

int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_DOCUMENT) {
System.out.println("Start document:");
} else if (eventType == XmlPullParser.END_DOCUMENT) {
System.out.println("End document");
} else if (eventType == XmlPullParser.START_TAG) {
System.out.println(" " + parser.getName());
System.out.println("Start Count: " + parser.getAttributeCount());
int size = parser.getAttributeCount();
for(int i=0; i<size; i++){
System.out.println(" " + parser.getAttributeName(i));
System.out.println(" " + parser.getAttributeValue(i));
}


} else if (eventType == XmlPullParser.END_TAG) {
System.out.println(" " + parser.getName());
} else if (eventType == XmlPullParser.TEXT) {
System.out.println(" " + parser.getText());
}

eventType = parser.next();
}

13,100

社区成员

发帖
与我相关
我的任务
社区描述
Java J2ME
社区管理员
  • J2ME社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧