字符串处理难题? 我们用的是Castor的xml解析,觉得非常得心应手,当然个人癖好,也可用JDom,也可用javax.xml.等等。自己写各类来解析,我认为没有必要。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你的<r></r>可能还含有<r></r>???如果含有,都要输出,是吗? 使用java的dom树来直接生成数据结构不是更好吗?试试吧 代码1:public class TestParseXml{ private static String tag; public static java.io.InputStream getXmlStream() { String xml="<root><r><xx>ddd</xx></r><c><p name=\"5\">erw</p></c><r>trter</r><aa><r>ff</r></aa></root>"; setFilterTag("r"); return new java.io.ByteArrayInputStream(xml.getBytes()); } class MyHandler extends org.xml.sax.helpers.DefaultHandler { private String part=null; public void startElement(String uri, String localName, String qName, org.xml.sax.Attributes attributes) { if (qName.equals(tag)) { part="<"+tag+">"; } else if (part!=null) { part+="<"+qName+">"; } } public void endElement(String uri, String localName, String qName) { if (qName.equals(tag)) { part += "</" + tag + ">"; System.out.println(part); } else part += "</" + qName + ">"; } public void characters(char[] ch, int start, int length) { part += new String(ch,start,length); } } public static void setFilterTag(String tag) { TestParseXml.tag = tag; } public static void main(String[] args) throws Exception { javax.xml.parsers.SAXParserFactory saxParserFtr = javax.xml.parsers.SAXParserFactory.newInstance(); javax.xml.parsers.SAXParser parser = saxParserFtr.newSAXParser(); java.io.InputStream is = getXmlStream(); parser.parse(new org.xml.sax.InputSource(is),new TestParseXml().new MyHandler()); }}输出:<r><xx>ddd</xx></r><r>trter</r><r>ff</r> 代码2:public class TestParseXml{ private static String tag; public static java.io.InputStream getXmlStream() { String xml = "<root><r><xx>ddd</xx></r><c><p name=\"5\">erw</p></c><r>trter</r><aa><r>ff</r></aa></root>"; setFilterTag("r"); return new java.io.ByteArrayInputStream(xml.getBytes()); } class MyHandler extends org.xml.sax.helpers.DefaultHandler { private String part = null; public void startElement(String uri, String localName, String qName, org.xml.sax.Attributes attributes) { if (qName.equals(tag)) {// part = "<" + tag + ">"; part=""; } else if (part != null) { part += "<" + qName + ">"; } } public void endElement(String uri, String localName, String qName) { if (qName.equals(tag)) {// part += "</" + tag + ">"; System.out.println(part); } else { part += "</" + qName + ">"; } } public void characters(char[] ch, int start, int length) { part += new String(ch, start, length); } } public static void setFilterTag(String tag) { TestParseXml.tag = tag; } public static void main(String[] args) throws Exception { javax.xml.parsers.SAXParserFactory saxParserFtr = javax.xml.parsers.SAXParserFactory.newInstance(); javax.xml.parsers.SAXParser parser = saxParserFtr.newSAXParser(); java.io.InputStream is = getXmlStream(); parser.parse(new org.xml.sax.InputSource(is), new TestParseXml().new MyHandler()); }}输出:<xx>ddd</xx>trterff 说明:1.原来的xml是:String xml = "<root><r><xx>ddd</xx></r><c><p name=\"5\">erw</p></c><r>trter</r><aa><r>ff</r></aa></root>";基本是楼主的,为了适应程序需要,加上了<root>。2.把String xml换成自己的内容就可以了。3.代码1的输出含有<r>本身的标记。代码2的输出不含有<r>标记。就是楼主说的<r></r>之间的内容。4.已经在JBuilder9+win2k下调试通过。具体使用哪个代码,看需求了。5.程序利用了SAX解析机制。没有采用DOM的原因是,DOM一次性加载到内存太浪费了。而且遍历DOM也不方便,要自己写递归程序。6.so...,代码如上! 多谢 feiyuegaoshan(飞跃)兄,但您这XML node的属性不能显示出来 public class TestParseXml{ private static String tag; class MyHandler extends org.xml.sax.helpers.DefaultHandler { private String part = null; private String getAttr(org.xml.sax.Attributes t) { String s=""; for(int i=0;i<t.getLength();i++) { s=s+" " +t.getQName(i) +"=\""+ t.getValue(i)+"\""; } return s; } public void startElement(String uri, String localName, String qName, org.xml.sax.Attributes attributes) { if (qName.equals(tag)) { part = "<" + tag + getAttr(attributes)+ ">";// part=""; } else if (part != null) { part += "<" + qName + getAttr(attributes) + ">"; } } public void endElement(String uri, String localName, String qName) { if (qName.equals(tag)) { part += "</" + tag + ">"; System.out.println(part); } else { part += "</" + qName + ">"; } } public void characters(char[] ch, int start, int length) { part += new String(ch, start, length); } } public static void setFilterTag(String tag) { TestParseXml.tag = tag; } public static java.io.InputStream getXmlStream() { String xml = "<root><r><xx test=\"hello!\">ddd</xx></r><c><p name=\"5\">erw</p></c><r>trter</r><aa><r>ff</r></aa></root>"; setFilterTag("r"); return new java.io.ByteArrayInputStream(xml.getBytes()); } public static void main(String[] args) throws Exception { javax.xml.parsers.SAXParserFactory saxParserFtr = javax.xml.parsers.SAXParserFactory.newInstance(); javax.xml.parsers.SAXParser parser = saxParserFtr.newSAXParser(); java.io.InputStream is = getXmlStream(); parser.parse(new org.xml.sax.InputSource(is), new TestParseXml().new MyHandler()); }} 求用Java写一道选择题的程序,包括单选和多选.谢谢! 如何在一画板上实现双击添加文本框? 麻烦哪位童鞋们,帮我看一下这个程序咋写呀! java执行sql server的select count的效率,怎么样写,效率最高? 使用用JDK的困惑,输入statement想找帮助.... 求助,用runge-kutta法解微分方程 触发器怎么失效了? 求教正则表达式 鼠标放在控件上的时候冒泡显示提示文字,鼠标离开才会消失?怎么做? 如何将矢量元素转换为String类型? 一个小问题 字符串处理的问题?
试试吧
public class TestParseXml
{
private static String tag;
public static java.io.InputStream getXmlStream()
{
String xml="<root><r><xx>ddd</xx></r><c><p name=\"5\">erw</p></c><r>trter</r><aa><r>ff</r></aa></root>";
setFilterTag("r");
return new java.io.ByteArrayInputStream(xml.getBytes());
}
class MyHandler extends org.xml.sax.helpers.DefaultHandler
{
private String part=null;
public void startElement(String uri, String localName, String qName, org.xml.sax.Attributes attributes)
{
if (qName.equals(tag))
{
part="<"+tag+">";
}
else if (part!=null)
{
part+="<"+qName+">";
} }
public void endElement(String uri, String localName, String qName)
{
if (qName.equals(tag))
{
part += "</" + tag + ">";
System.out.println(part);
}
else
part += "</" + qName + ">";
}
public void characters(char[] ch, int start, int length)
{
part += new String(ch,start,length);
} }
public static void setFilterTag(String tag)
{
TestParseXml.tag = tag;
}
public static void main(String[] args) throws Exception
{
javax.xml.parsers.SAXParserFactory saxParserFtr =
javax.xml.parsers.SAXParserFactory.newInstance();
javax.xml.parsers.SAXParser parser = saxParserFtr.newSAXParser();
java.io.InputStream is = getXmlStream();
parser.parse(new org.xml.sax.InputSource(is),new TestParseXml().new MyHandler()); }
}
输出:
<r><xx>ddd</xx></r>
<r>trter</r>
<r>ff</r>
public class TestParseXml
{
private static String tag;
public static java.io.InputStream getXmlStream()
{
String xml = "<root><r><xx>ddd</xx></r><c><p name=\"5\">erw</p></c><r>trter</r><aa><r>ff</r></aa></root>";
setFilterTag("r");
return new java.io.ByteArrayInputStream(xml.getBytes());
}
class MyHandler
extends org.xml.sax.helpers.DefaultHandler
{
private String part = null;
public void startElement(String uri, String localName, String qName,
org.xml.sax.Attributes attributes)
{
if (qName.equals(tag))
{
// part = "<" + tag + ">";
part="";
}
else if (part != null)
{
part += "<" + qName + ">";
}
}
public void endElement(String uri, String localName, String qName)
{
if (qName.equals(tag))
{
// part += "</" + tag + ">";
System.out.println(part);
}
else
{
part += "</" + qName + ">";
}
}
public void characters(char[] ch, int start, int length)
{
part += new String(ch, start, length);
}
}
public static void setFilterTag(String tag)
{
TestParseXml.tag = tag;
}
public static void main(String[] args) throws Exception
{
javax.xml.parsers.SAXParserFactory saxParserFtr =
javax.xml.parsers.SAXParserFactory.newInstance();
javax.xml.parsers.SAXParser parser = saxParserFtr.newSAXParser();
java.io.InputStream is = getXmlStream();
parser.parse(new org.xml.sax.InputSource(is),
new TestParseXml().new MyHandler());
}
}
输出:
<xx>ddd</xx>
trter
ff
1.原来的xml是:String xml = "<root><r><xx>ddd</xx></r><c><p name=\"5\">erw</p></c><r>trter</r><aa><r>ff</r></aa></root>";
基本是楼主的,为了适应程序需要,加上了<root>。2.把String xml换成自己的内容就可以了。
3.代码1的输出含有<r>本身的标记。代码2的输出不含有<r>标记。就是楼主说的<r></r>之间的内容。
4.已经在JBuilder9+win2k下调试通过。具体使用哪个代码,看需求了。
5.程序利用了SAX解析机制。没有采用DOM的原因是,DOM一次性加载到内存太浪费了。
而且遍历DOM也不方便,要自己写递归程序。
6.so...,代码如上!
但您这XML node的属性不能显示出来
public class TestParseXml
{
private static String tag;
class MyHandler
extends org.xml.sax.helpers.DefaultHandler
{
private String part = null;
private String getAttr(org.xml.sax.Attributes t)
{
String s="";
for(int i=0;i<t.getLength();i++)
{
s=s+" " +t.getQName(i) +"=\""+ t.getValue(i)+"\"";
}
return s;
} public void startElement(String uri, String localName, String qName,
org.xml.sax.Attributes attributes)
{
if (qName.equals(tag))
{
part = "<" + tag + getAttr(attributes)+ ">";
// part="";
}
else if (part != null)
{
part += "<" + qName + getAttr(attributes) + ">";
}
}
public void endElement(String uri, String localName, String qName)
{
if (qName.equals(tag))
{
part += "</" + tag + ">";
System.out.println(part);
}
else
{
part += "</" + qName + ">";
}
}
public void characters(char[] ch, int start, int length)
{
part += new String(ch, start, length);
}
}
public static void setFilterTag(String tag)
{
TestParseXml.tag = tag;
} public static java.io.InputStream getXmlStream()
{
String xml = "<root><r><xx test=\"hello!\">ddd</xx></r><c><p name=\"5\">erw</p></c><r>trter</r><aa><r>ff</r></aa></root>";
setFilterTag("r");
return new java.io.ByteArrayInputStream(xml.getBytes());
}
public static void main(String[] args) throws Exception
{
javax.xml.parsers.SAXParserFactory saxParserFtr =
javax.xml.parsers.SAXParserFactory.newInstance();
javax.xml.parsers.SAXParser parser = saxParserFtr.newSAXParser();
java.io.InputStream is = getXmlStream();
parser.parse(new org.xml.sax.InputSource(is),
new TestParseXml().new MyHandler());
}
}