通过URL来源从XML文件中提取信息需要花费大量时间

时间:2018-07-17 08:56:04

标签: xpath sax jdom-2

我想从108个Xml文件中提取特定信息。通用来源也是带有其他URL作为资源的XML文件。 XML-Source 静态方法getURL()提取URL,以便在main方法中的for循环内将它们设置为URL路径。该程序可以工作,但是大约需要花费时间。 5分钟从所有文件中获取数据。任何想法如何提高性能?

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.Namespace;
import org.jdom2.filter.Filters;
import org.jdom2.input.SAXBuilder;
import org.jdom2.xpath.XPathExpression;
import org.jdom2.xpath.XPathFactory;

public class XmlReader2 {

    public static void main(String[] args) throws IOException {

        for (int i = 0; i < getURL().size(); i++) {
            URL url = new URL(getURL().get(i));



            try {
                Document doc = new SAXBuilder().build(url);


                final String getDeath = String
                        .format("//ns:teiHeader/ns:profileDesc/ns:particDesc/ns:listPerson/ns:person/ns:death");

                XPathExpression<Element> xpath = XPathFactory.instance().compile(getDeath, Filters.element(), null,
                        Namespace.getNamespace("ns", "http://www.tei-c.org/ns/1.0"));

                String test;
                for (Element elem : xpath.evaluate(doc)) {
                    test = elem.getValue();
                    if (elem.getAttributes().size() != 0) {
                        test = elem.getAttributes().get(0).getValue();
                    }
                    System.out.println(elem.getName() + ": " + test); 
                }

            } catch (org.jdom2.JDOMException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    public static List<String> getURL() throws IOException {

        List<String> urlList = new ArrayList<>();
        URL urlSource = new URL("http://www.steinheim-institut.de:80/cgi-bin/epidat?info=resources-mz1");
        try {
            Document doc = new SAXBuilder().build(urlSource);

            final String getURL = String.format("/collection");
            XPathExpression<Element> xpath = XPathFactory.instance().compile(getURL, Filters.element());

            int i = 0;
            for (Element elem : xpath.evaluate(doc)) {
                while (i != elem.getChildren().size()) {
                    String url = elem.getChildren().get(i).getAttributes().get(1).getValue();
                    // System.out.println(url);
                    urlList.add(url);
                    i++;
                }
            }


        } catch (org.jdom2.JDOMException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return urlList;
    }
}

1 个答案:

答案 0 :(得分:0)

此顺序的延迟可能是由于从网络上获取文件引起的。找到一个工具来监视从您的计算机发出的HTTP请求,以查看发生了什么情况。特别要注意对诸如XHTML DTD之类的常见W3C文件的请求:由于经常请求这些文件,因此W3C故意在过程中添加延迟,以鼓励人们使用文件的本地副本。如果事实证明是问题所在,则可以使用多种技术来访问缓存的本地副本。

话虽如此,我对您代码的逻辑感到困惑。每次调用getURL()时,方法http://www.steinheim-institut.de:80/cgi-bin/epidat?info=resources-mz1似乎都在getURL().size()处获取并解析文档,但是您甚至在循环中都调用了它,甚至使用<Form/>作为终止条件。