简体   繁体   English

解析java中的xml字符串?

[英]parse an xml string in java?

how do you parse xml stored in a java string object? 你如何解析存储在java字符串对象中的xml?

Java's XMLReader only parses XML documents from a URI or inputstream. Java的XMLReader仅解析URI或输入流中的XML文档。 is it not possible to parse from a String containing an xml data? 是不是可以从包含xml数据的String解析?

Right now I have the following: 现在我有以下内容:

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

And on my handler i have this: 在我的处理程序上我有这个:

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

Thanks in advance 提前致谢

The SAXParser can read an InputSource . SAXParser可以读取 InputSource

An InputSource can take a Reader in its constructor InputSource可以在其构造函数中使用Reader

So, you can put parse XML string via a StringReader 因此,您可以通过StringReader放置解析XML字符串

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

尝试jcabi-xml (请参阅此博客文章 ):

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

Your XML might be simple enough to parse manually using the DOM or SAX API, but I'd still suggest using an XML serialization API such as JAXB , XStream , or Simple instead because writing your own XML serialization/deserialization code is a drag. 您的XML可能很简单,可以使用DOM或SAX API手动解析,但我仍然建议使用XML序列化API,例如JAXBXStreamSimple,因为编写自己的XML序列化/反序列化代码是一种拖累。

Note that the XStream FAQ erroneously claims that you must use generated classes with JAXB: 请注意,XStream FAQ错误地声称必须使用生成的类与JAXB:

How does XStream compare to JAXB (Java API for XML Binding)? XStream与JAXB(用于XML绑定的Java API)相比如何?

JAXB is a Java binding tool. JAXB是一个Java绑定工具。 It generates Java code from a schema and you are able to transform from those classes into XML matching the processed schema and back. 它从模式生成Java代码,您可以从这些类转换为与处理后的模式匹配的XML。 Note, that you cannot use your own objects, you have to use what is generated. 注意,您不能使用自己的对象,您必须使用生成的内容。

It seems this was true was true at one time, but JAXB 2.0 no longer requires you to use Java classes generated from a schema. 似乎这种情况一度都是正确的,但JAXB 2.0不再要求您使用从模式生成的Java类。

If you go this route, be sure to check out the side-by-side comparisons of the serialization/marshalling APIs I've mentioned: 如果你走这条路,请务必查看我提到的序列化/编组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 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

Take a look at this: http://www.rgagnon.com/javadetails/java-0573.html 看看这个: 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 "?";
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM