繁体   English   中英

将XML文件解析为对象的最佳方法是什么? (Java)

[英]What would be the optimal to parse XML files into objects? (Java)

我正在制作一个简单的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文件包含大量的更多数据,但我只需要一些项目。 如果需要任何其他信息,只需询问。

我没有同意的经验,但是如果能提高效率,我会研究一下。

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

  }

 }

暂无
暂无

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

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