在java中解析一个xml字符串?

Posted

技术标签:

【中文标题】在java中解析一个xml字符串?【英文标题】:parse an xml string in java? 【发布时间】:2011-04-23 20:12:37 【问题描述】:

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

Java 的 XMLReader 仅从 URI 或输入流解析 XML 文档。是不是不能从包含 xml 数据的 String 中解析出来?

现在我有以下内容:

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);
        

提前致谢

【问题讨论】:

你可以看看这个:***.com/questions/247161/… 【参考方案1】:

SAXParser 可以是 read 和 InputSource。

InputSource 可以在其constructor

中使用Reader

所以,你可以通过 StringReader 来解析 XML 字符串

new InputSource(new StringReader("... your xml here....")));

【讨论】:

【参考方案2】:

试试jcabi-xml(见blog post)用单线:

XML xml = new XMLDocument("<document>...</document>")

【讨论】:

【参考方案3】:

您的 XML 可能很简单,可以使用 DOM 或 SAX API 手动解析,但我仍然建议使用 XML 序列化 API,例如 JAXB、XStream 或 Simple,因为要编写自己的 XML序列化/反序列化代码很麻烦。

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

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

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

这似乎是真的,但 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

【讨论】:

【参考方案4】:

看看这个: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 "?";
  

【讨论】:

以上是关于在java中解析一个xml字符串?的主要内容,如果未能解决你的问题,请参考以下文章

java解析Xml格式的字符串

如何在Java(Android)中解析包含XML的字符串[重复]

java怎么在xml文件中保存和读取字符串数组

在java中解析xml有哪几种方法

java将字符串转换为xml并解析节点[重复]

java解析xml的几种方式哪种最好?