Подтвердить что ты не робот

Проанализировать строку xml в java?

как вы разбираете 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);
        }
}

Заранее спасибо

4b9b3361

Ответ 1

SAXParser может читать a InputSource.

InputSource может использовать Reader в своем конструкторе

Итак, вы можете поместить XML-строку синтаксического анализа через StringReader

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

Ответ 2

Попробуйте jcabi-xml (см. это сообщение в блоге) с одним слоем:

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

Ответ 3

Взгляните на это: 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 "?";
  }
}

Ответ 4

Ваш 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