将XML文件解析为对象的最佳选择是什么? (JAVA)

时间:2015-04-28 04:33:10

标签: java xml

我正在创建一个简单的JavaFX应用程序来创建一个用于XML格式的BLASTP输出数据分析的表。它并不是非常慢,但我只是想让程序尽可能高效。我添加了很多代码,因为真实的文件非常大,但它们传达了大致的轮廓。我不是在寻找有人为我编写代码,只是建议我何时需要加载大量的xml,比如查看这个api或者尝试将文件加载到这个对象中。表中的xml如下:

从FileChooser收集文件

public void listChange() throws //ALLEXCEPTIONS// {
    List<File> files = fc.showOpenMultipleDialog(new Stage());
    if (files != null) {
        files.forEach(f -> {
            try {
                xmlDataList.add(XMLFile(f.getPath()));
            } catch (//ALLEXCEPTIONS//) {
                e.printStackTrace();
            }
        });
    }
}

通过SAX解析器将文件运行到对象XMLDATA

public XMLData XMLFile(String path) throws //ALLEXCEPTIONS// {
    if (path.endsWith(".xml")) {
        SAXParserFactory parserFactor = SAXParserFactory.newInstance();
        SAXHandler saxh = new SAXHandler();
        SAXParser parser = parserFactor.newSAXParser();
        parser.parse(path, saxh);
        int suffix = 1;
        String pname = path.substring(path.lastIndexOf("\\")+1, path.length() - 4), temp = pname;
        ArrayList<String> xmldataname = new ArrayList<>();
        xmlDataArrayListist.forEach(x -> xmldataname.add(x.pName));
        System.out.println("Finished");
        return new XMLData(saxh.hitList, temp);
    }
    else{
        return null;
    }
}

SAX处理程序创建一个名为HSPS(高得分蛋白质序列)的对象列表,在该对象中是另一个对象HSP(高得分蛋白质)。

public class SAXHandler extends DefaultHandler {
    public ArrayList<HSPS> hitList = new ArrayList<>();
    @Override
    public void startElement(String u, String ln, String ele, Attributes at)
            throws SAXException {
        switch(ele){
            case "Hit":
                hsps = new HSPS();
                break;
            case "Hsp":
                hsp = new HSP();
                break;
        }
    }
    @Override
    public void endElement(String uri, String ln,String ele) throws SAXException {
        switch(ele){
            case "Hit_hsps":
                hitList.add(hsps);
                break;
            case "Hsp":
                hsps.hspL.add(hsp);
                break;
            case "Hit_def":
                hsps.name = content;
                break;
            case "Hit_id":
                hsps.id = content;
                break;
        }
    }
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        content = String.copyValueOf(ch, start, length);
    }

}

对象HSPS包含HSP列表和这些序列所属蛋白质的名称。 HSP对象包含许多带数据的字符串。 该表只是读取XMLFile对象中HSPS中的所有HSP。

所以我想我的问题是,这是将正确的项目转移到桌面的最佳方式吗? xml文件包含更多数据,但我只想要几个项目。如果需要任何附加信息,请询问。

我没有经验,但如果它会提高效率,我会调查它。

1 个答案:

答案 0 :(得分:0)

 Try simple-xml very simple as name suggested.

Maven依赖

    <dependency>
        <groupId>org.simpleframework</groupId>
        <artifactId>simple-xml</artifactId>
        <scope>compile</scope>
        <version>2.7.1</version>
    </dependency>

示例代码

 package com.vibhs.stack.overflow.xml;

 import java.io.File;
 import org.simpleframework.xml.Serializer;
 import org.simpleframework.xml.core.Persister;

 public class Parser {

  private Serializer serializer = new Persister();

  public void createXML(Object object, File destination) throws Exception {

     serializer.write(object, destination);

   }

  public Object readXML(Class<?> clazz, File source) throws Exception {

    return serializer.read(clazz, source);

  }

 }