如何解析此XML文件以及要使用的解析器?

时间:2014-01-17 16:59:05

标签: java xml-parsing saxparser

我是XMLParsing的新手。 它今天坐在工作中,无需解析文件并将其放入arrayList。

我的文件看起来有点像这样

<type>
 <OBJECT_TYPE>horse</OBJECT_TYPE>
   <prop>blabla</prop>
   <param>black</param>
  <OBJECT_TYPE>cat</OBJECT_TYPE>
   <prop>blabla</prop>
   <param>black</param>
  <OBJECT_TYPE>car</OBJECT_TYPE>
   <prop>blabla</prop>
   <param>black</param>
</type>

但是很长时间而不是那个内容。 我尝试使用SaxParser但没有成功。 而且我已经阅读了几乎所有的SaxParser版本,但是所有解析xml都具有属性,而且我的XML没有任何属性。

那么对于这种XML,我应该使用哪种解析器将其保存到ArrayList中? 而且我只想列出我的OBJECT_TYPES。没有道具也没有参数。

3 个答案:

答案 0 :(得分:1)

SAX解析这种格式的标准模式是

  • startElement
    • 如果标记名称为OBJECT_TYPE,则创建一个新缓冲区(例如StringBuilder)以收集字符数据。
  • characters
    • 如果有活动缓冲区,则将当前的字符块附加到该缓冲区
  • endElement
    • 如果标记名称为OBJECT_TYPE,则将缓冲区转换为字符串并执行您需要执行的任何操作。

解析器会将元素的文本内容传递给处理程序的characters方法,但不能保证在一个块中为您提供整个连续文本块,这就是为什么需要累积它在缓冲区中并在endElement进行处理。

答案 1 :(得分:1)

这就是

的方式
import java.util.ArrayList;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class ReadXMLFile {

   public static void main(String argv[]) {
       final ArrayList<String> al=new ArrayList<String>();

    try {

    SAXParserFactory factory = SAXParserFactory.newInstance();
    SAXParser saxParser = factory.newSAXParser();

    DefaultHandler handler = new DefaultHandler() {

    boolean bfname = false;
    boolean blname = false;
    boolean bnname = false;
    boolean bsalary = false;

    public void startElement(String uri, String localName,String qName, 
                Attributes attributes) throws SAXException {

        System.out.println("Start Element :" + qName);

        if (qName.equalsIgnoreCase("OBJECT_TYPE")) {
            bfname = true;
        }



    }

    public void endElement(String uri, String localName,
        String qName) throws SAXException {

        System.out.println("End Element :" + qName);

    }

    public void characters(char ch[], int start, int length) throws SAXException {

        if (bfname) {

            al.add(new String(ch, start, length));
            bfname = false;
        }



    }

     };

       saxParser.parse("C:\\Users\\Naren\\workspace\\Regex\\src\\test.xml", handler);
       System.out.println(al);

     } catch (Exception e) {
       e.printStackTrace();
     }

   }

}

输出

[马,猫,车]

答案 2 :(得分:0)

这就是我解决它的方法:

public void ParserForObjectTypes() throws SAXException, IOException,
            ParserConfigurationException {

        try {
            FileInputStream file = new FileInputStream(new File(
                    "xmlFiles/CoreDatamodel.xml"));

            DocumentBuilderFactory builderFactory = DocumentBuilderFactory
                    .newInstance();

            DocumentBuilder builder = builderFactory.newDocumentBuilder();

            Document xmlDocument = builder.parse(file);

            XPath xPath = XPathFactory.newInstance().newXPath();

            String expression = "//OBJECT_TYPE";
            NodeList nodeList = (NodeList) xPath.compile(expression).evaluate(
                    xmlDocument, XPathConstants.NODESET);
            for (int i = 0; i < nodeList.getLength(); i++) {


                model.addElement(nodeList.item(i).getFirstChild()
                        .getNodeValue());

            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (XPathExpressionException e) {
            e.printStackTrace();
        }
    }