在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字符串?的主要内容,如果未能解决你的问题,请参考以下文章