2010-10-11 119 views
19

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

Java的XMLReader仅解析来自URI或输入流的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); 
     } 
} 

感谢

+1

你可以看看这个:http://stackoverflow.com/questions/247161/how-do-i-turn-a-string-into-a-stream-in -java – foret 2010-10-11 14:00:58

回答

1

看看这个:http://www.rgagnon.com/javadetails/java-0573.html

import javax.xml.parsers.*; 
import org.xml.sax.InputSource; 
import org.w3c.dom.*; 
import java.io.*; 

public class ParseXMLString { 

    public static void main(String arg[]) { 
    String xmlRecords = 
     "<data>" + 
     " <employee>" + 
     " <name>John</name>" + 
     " <title>Manager</title>" + 
     " </employee>" + 
     " <employee>" + 
     " <name>Sara</name>" + 
     " <title>Clerk</title>" + 
     " </employee>" + 
     "</data>"; 

    try { 
     DocumentBuilderFactory dbf = 
      DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db = dbf.newDocumentBuilder(); 
     InputSource is = new InputSource(); 
     is.setCharacterStream(new StringReader(xmlRecords)); 

     Document doc = db.parse(is); 
     NodeList nodes = doc.getElementsByTagName("employee"); 

     // iterate the employees 
     for (int i = 0; i < nodes.getLength(); i++) { 
      Element element = (Element) nodes.item(i); 

      NodeList name = element.getElementsByTagName("name"); 
      Element line = (Element) name.item(0); 
      System.out.println("Name: " + getCharacterDataFromElement(line)); 

      NodeList title = element.getElementsByTagName("title"); 
      line = (Element) title.item(0); 
      System.out.println("Title: " + getCharacterDataFromElement(line)); 
     } 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 
    /* 
    output : 
     Name: John 
     Title: Manager 
     Name: Sara 
     Title: Clerk 
    */  

    } 

    public static String getCharacterDataFromElement(Element e) { 
    Node child = e.getFirstChild(); 
    if (child instanceof CharacterData) { 
     CharacterData cd = (CharacterData) child; 
     return cd.getData(); 
    } 
    return "?"; 
    } 
} 
1

你的XML可能是很简单的手工解析使用把解析XML字符串DOM或SAX API,但我仍然建议使用XML序列化API,例如JAXB,XStreamSimple,而不是因为编写自己的XML序列化/请求者ialization代码是一个拖动。

注意,XStream的常见问题错误地声称,您必须使用生成的类与JAXB:

如何XStream的比较JAXB(用于XML绑定的Java API)?

JAXB是一个Java绑定工具。它从一个模式生成Java代码,您可以将这些类转换为匹配处理后的模式的XML并返回。请注意,你不能使用自己的对象,你必须使用生成的东西。

似乎这是事实,但JAXB 2.0不再要求您使用从模式生成的Java类。

如果你走这条路,一定要检查出系列化的并排侧比较/编组我所提到的API:

http://blog.bdoughan.com/2010/10/how-does-jaxb-compare-to-xstream.html http://blog.bdoughan.com/2010/10/how-does-jaxb-compare-to-simple.html