将xml文件解析为对象的最佳方法是什么( java 语)

hjqgdpho  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(278)

我正在制作一个简单的javafx应用程序来生成一个表,用于对xml格式的blastp输出进行数据分析。这不是难以置信的慢,但我只是想让程序尽可能有效。我添加的代码减少了很多,因为真正的文件是相当大的,但他们传达的大致轮廓。我不想找人为我写代码,只是当我必须加载大量的xml时的建议,比如看一下这个api或尝试将文件加载到这个对象中。xml to表如下所示:
从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对象中hsp中的所有hsp。
所以,我想我的问题是,这是将正确的项目转移到表中的最佳方式吗?xml文件包含大量的数据,但我只需要一些项目。如果需要任何补充信息,请询问。
我对并发没有经验,但如果它能提高效率,我会研究它。

8yoxcaq7

8yoxcaq71#

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

  }

 }

相关问题