Ответ 1
SAXParser может читать a InputSource.
InputSource может использовать Reader в своем конструкторе
Итак, вы можете поместить XML-строку синтаксического анализа через StringReader
new InputSource(new StringReader("... your xml here....")));
как вы разбираете xml, хранящийся в объекте строки java?
Java XMLReader анализирует только XML-документы из URI или входного потока. разве невозможно разобрать из строки, содержащей данные 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);
}
}
Заранее спасибо
SAXParser может читать a InputSource.
InputSource может использовать Reader в своем конструкторе
Итак, вы можете поместить XML-строку синтаксического анализа через StringReader
new InputSource(new StringReader("... your xml here....")));
Попробуйте jcabi-xml (см. это сообщение в блоге) с одним слоем:
XML xml = new XMLDocument("<document>...</document>")
Взгляните на это: 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 "?";
}
}
Ваш XML может быть достаточно простым для ручного анализа с помощью API DOM или SAX, но я бы предложил использовать API-интерфейс сериализации XML, например JAXB, XStream или Simple вместо потому что писать собственный код сериализации/десериализации XML - это перетаскивание.
Обратите внимание, что в FAQ XStream ошибочно утверждается, что вы должны использовать сгенерированные классы с JAXB:
Как XStream сравнивается с JAXB (Java API для привязки XML)?
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