在java中解析xml字符串?

在java中解析xml字符串?,java,xml,Java,Xml,如何解析存储在java字符串对象中的xml Java的XMLReader只解析URI或inputstream中的XML文档。无法从包含xml数据的字符串进行解析吗 现在我有以下几点: try { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser sp = factory.newSAXParser(); XMLReader xr = sp.getXMLReader(); Co

如何解析存储在java字符串对象中的xml

Java的XMLReader只解析URI或inputstream中的XML文档。无法从包含xml数据的字符串进行解析吗

现在我有以下几点:

try {
    SAXParserFactory factory = SAXParserFactory.newInstance();
    SAXParser sp = factory.newSAXParser();
    XMLReader xr = sp.getXMLReader(); 

    ContactListXmlHandler handler = new ContactListXmlHandler();
    xr.setContentHandler(handler);
    xr.p
} catch (ParserConfigurationException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (SAXException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
在我的处理器上,我有:

public class ContactListXmlHandler extends DefaultHandler implements Resources {

    private List<ContactName> contactNameList = new ArrayList<ContactName>();

    private ContactName contactItem;

    private StringBuffer sb;

    public List<ContactName> getContactNameList() {
        return contactNameList;
    }

    @Override
    public void startDocument() throws SAXException {
        // TODO Auto-generated method stub
        super.startDocument();

        sb = new StringBuffer();
    }

    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        // TODO Auto-generated method stub
        super.startElement(uri, localName, qName, attributes);
        if(localName.equals(XML_CONTACT_NAME)){
            contactItem = new ContactName();
        }

        sb.setLength(0);

    }

    @Override
    public void characters(char[] ch, int start, int length){
        // TODO Auto-generated method stub
        try {
            super.characters(ch, start, length);
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        sb.append(ch, start, length);
    }

    @Override
    public void endDocument() throws SAXException {
        // TODO Auto-generated method stub
        super.endDocument();
    }

    /**
     * where the real stuff happens
     */
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        // TODO Auto-generated method stub
        //super.endElement(arg0, arg1, arg2);

        if(contactItem != null){
            if (localName.equalsIgnoreCase("title")) {
                contactItem.setUid(sb.toString());
                Log.d("handler", "setTitle = " + sb.toString());

            } else if (localName.equalsIgnoreCase("link")) {
                contactItem.setFullName(sb.toString());

            } else if (localName.equalsIgnoreCase("item")){
                Log.d("handler", "adding rss item");
                contactNameList.add(contactItem);
            }

            sb.setLength(0);
        }
}
公共类ContactListXmlHandler扩展DefaultHandler实现资源{
private List contactNameList=new ArrayList();
私人联系人姓名联系人项目;
私家侦探;某人;
公共列表getContactNameList(){
返回联系人名单;
}
@凌驾
public void startDocument()引发异常{
//TODO自动生成的方法存根
super.startDocument();
sb=新的StringBuffer();
}
@凌驾
public void startElement(字符串uri、字符串localName、字符串qName、,
属性)引发SAX异常{
//TODO自动生成的方法存根
startElement(uri、localName、qName、属性);
if(localName.equals(XML\u CONTACT\u NAME)){
contactItem=新的ContactName();
}
sb.设定长度(0);
}
@凌驾
公共无效字符(字符[]ch,整数开始,整数长度){
//TODO自动生成的方法存根
试一试{
超级字符(ch、开始、长度);
}捕获(SAXE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
sb.追加(ch、开始、长度);
}
@凌驾
public void endDocument()引发异常{
//TODO自动生成的方法存根
super.endDocument();
}
/**
*真正的事情发生在哪里
*/
@凌驾
公共void endElement(字符串uri、字符串localName、字符串qName)
抛出SAX异常{
//TODO自动生成的方法存根
//super.endElement(arg0、arg1、arg2);
if(contactItem!=null){
if(localName.equalsIgnoreCase(“标题”)){
contactItem.setUid(sb.toString());
Log.d(“handler”、“setTitle=“+sb.toString());
}else if(localName.equalsIgnoreCase(“链接”)){
contactItem.setFullName(sb.toString());
}else if(localName.equalsIgnoreCase(“项”)){
Log.d(“处理程序”,“添加rss项”);
ContactName列表。添加(contactItem);
}
sb.设定长度(0);
}
}
提前感谢

看看这个:

import javax.xml.parsers.*;
导入org.xml.sax.InputSource;
导入org.w3c.dom.*;
导入java.io.*;
公共类ParseXMLString{
公共静态void main(字符串arg[]){
字符串XML记录=
"" +
" " +
“约翰”+
“经理”+
" " +
" " +
“莎拉”+
“职员”+
" " +
"";
试一试{
DocumentBuilderFactory dbf=
DocumentBuilderFactory.newInstance();
DocumentBuilder db=dbf.newDocumentBuilder();
InputSource is=新的InputSource();
is.setCharacterStream(新的StringReader(xmlRecords));
文档doc=db.parse(is);
NodeList节点=doc.getElementsByTagName(“员工”);
//对员工进行迭代
对于(int i=0;i
can是一个

输入源可以在其

因此,您可以通过


您的XML可能足够简单,可以使用DOM或SAXAPI手动解析,但我仍然建议使用XML序列化API,例如,或者,因为编写自己的XML序列化/反序列化代码是件麻烦事

请注意,XStream FAQ错误地宣称必须将生成的类与JAXB一起使用:

XStream与JAXB(用于XML绑定的JavaAPI)相比如何

JAXB是一个Java绑定工具,它从模式和 您可以将这些类转换为与 已处理架构并返回。请注意,您不能使用自己的对象, 您必须使用生成的内容

这似乎是真的,但JAXB2.0不再要求您使用从模式生成的Java类

如果您选择此路线,请务必查看我提到的序列化/编组API的并排比较:

用一个衬里试试(见此):

XML xml = new XMLDocument("<document>...</document>")
xmlxml=newxmldocument(“…”)
您可以查看以下内容:
new InputSource(new StringReader("... your xml here....")));
XML xml = new XMLDocument("<document>...</document>")