मैंने एक्सएमएल प्रतिक्रियाओं के रूप में परिणाम लाने के लिए निम्नलिखित कोड लिखा था और इसकी कुछ सामग्री जावा से फ़ाइल में लिखी थी। यह एक सार्वजनिक डेटाबेस से लगभग 700,000 प्रश्नों के लिए XML-प्रतिक्रिया प्राप्त करके किया जाता है।

हालाँकि, इससे पहले कि कोड फ़ाइल को लिख सके, इसे या तो कुछ यादृच्छिक अपवाद (सर्वर से) द्वारा कोड में एक यादृच्छिक स्थिति में रोक दिया जाता है। मैंने फॉर-लूप से ही फाइल को लिखने की कोशिश की, लेकिन ऐसा करने में सक्षम नहीं था। तो मैंने जावा हैश मैप में प्राप्त प्रतिक्रियाओं से भाग को स्टोर करने की कोशिश की और एक ही कॉल में फ़ाइल में हैश मैप लिखने की कोशिश की। लेकिन इससे पहले कि कोड फॉर-लूप में सभी प्रतिक्रियाएं प्राप्त करता है और उन्हें हैश मैप में संग्रहीत करता है, यह कुछ अपवाद (शायद 15000 वें पुनरावृत्ति पर !!) के साथ बंद हो जाता है। क्या जावा में फ़ाइल को लिखने का कोई अन्य प्रभावी तरीका है जब किसी को डेटा लाने के लिए ऐसे पुनरावृत्तियों की आवश्यकता होती है?

इस कोड के लिए मेरे द्वारा उपयोग की जाने वाली स्थानीय फ़ाइल यहां है।

मेरा कोड है,

import java.io.BufferedReader;              

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.Reader;
import java.io.StringWriter;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.XML;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;


public class random {

    static FileWriter fileWriter;
    static PrintWriter writer;

    public static void main(String[] args) {

        // Hashmap to store the MeSH values for each PMID 
        Map<String, String> universalMeSHMap = new HashMap<String, String>();

        try {

            // FileWriter for MeSH terms
            fileWriter = new FileWriter("/home/user/eclipse-workspace/pmidtomeshConverter/src/main/resources/outputFiles/pmidMESH.txt", true);
            writer = new PrintWriter(fileWriter);

            // Read the PMIDS from this file 
            String filePath = "file_attached_to_Post.txt";
            String line = null;
            BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath));


            String[] pmidsAll = null;

            int x = 0;
            try {
                //print first 2 lines or all if file has less than 2 lines
                while(((line = bufferedReader.readLine()) != null) && x < 1) {
                    pmidsAll = line.split(",");
                    x++;
                }   
            }
            finally {   
                bufferedReader.close();         
            }

            // List of strings containing the PMIDs
            List<String> pmidList = Arrays.asList(pmidsAll);

            // Iterate through the list of PMIDs to fetch the XML files from PubMed using eUtilities API service from PubMed
            for (int i = 0; i < pmidList.size(); i++) {


                String baseURL = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&retmode=xml&rettype=abstract&id=";

                // Process to get the PMIDs
                String indPMID_p0 = pmidList.get(i).toString().replace("[", "");
                String indPMID_p1 = indPMID_p0.replace("]", "");
                String indPMID_p2 = indPMID_p1.replace("\\", "");
                String indPMID_p3 = indPMID_p2.replace("\"", "");

                // Fetch XML response from the eUtilities into a document object 
                Document doc = parseXML(new URL(baseURL + indPMID_p3));

                // Convert the retrieved XMl into a Java String 
                String xmlString = xml2String(doc); // Converts xml from doc into a string

                // Convert the Java String into a JSON Object
                JSONObject jsonWithMeSH = XML.toJSONObject(xmlString);  // Converts the xml-string into JSON

                // -------------------------------------------------------------------
                // Getting the MeSH terms from a JSON Object
                // -------------------------------------------------------------------
                JSONObject ind_MeSH = jsonWithMeSH.getJSONObject("PubmedArticleSet").getJSONObject("PubmedArticle").getJSONObject("MedlineCitation");

                // List to store multiple MeSH types
                List<String> list_MeSH = new ArrayList<String>();
                if (ind_MeSH.has("MeshHeadingList")) {

                    for (int j = 0; j < ind_MeSH.getJSONObject("MeshHeadingList").getJSONArray("MeshHeading").length(); j++) {
                        list_MeSH.add(ind_MeSH.getJSONObject("MeshHeadingList").getJSONArray("MeshHeading").getJSONObject(j).getJSONObject("DescriptorName").get("content").toString());
                    }
                } else {

                    list_MeSH.add("null");

                }

                universalMeSHMap.put(indPMID_p3, String.join("\t", list_MeSH));

                writer.write(indPMID_p3 + ":" + String.join("\t", list_MeSH) + "\n");



            System.out.println("Completed iteration for " + i + " PMID");

        }

        // Write to the file here
        for (Map.Entry<String,String> entry : universalMeSHMap.entrySet()) {

            writer.append(entry.getKey() + ":" +  entry.getValue() + "\n");

        }

        System.out.print("Completed writing the file");

    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ParserConfigurationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SAXException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (TransformerException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } finally {
        writer.flush();
        writer_pubtype.flush();
        writer.close();
        writer_pubtype.close();
    }

}

private static String xml2String(Document doc) throws TransformerException {

    TransformerFactory transfac = TransformerFactory.newInstance();
    Transformer trans = transfac.newTransformer();
    trans.setOutputProperty(OutputKeys.METHOD, "xml");
    trans.setOutputProperty(OutputKeys.INDENT, "yes");
    trans.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", Integer.toString(2));

    StringWriter sw = new StringWriter();
    StreamResult result = new StreamResult(sw);
    DOMSource source = new DOMSource(doc.getDocumentElement());

    trans.transform(source, result);
    String xmlString = sw.toString();
    return xmlString;

}

private static Document parseXML(URL url) throws ParserConfigurationException, SAXException, IOException {
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document doc = db.parse((url).openStream());
    doc.getDocumentElement().normalize();
    return doc;
}

private static String readAll(Reader rd) throws IOException {
    StringBuilder sb = new StringBuilder();
    int cp;
    while ((cp = rd.read()) != -1) {
        sb.append((char) cp);
    }
    return sb.toString();
}

public static JSONObject readJsonFromUrl(String url) throws IOException, JSONException {
    InputStream is = new URL(url).openStream();
    try {
        BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
        String jsonText = readAll(rd);
        JSONObject json = new JSONObject(jsonText);
        return json;
    } finally {
        is.close();
    }
}

}

अपवाद से पहले यह कंसोल पर प्रिंट करता है।

  • 0 PMID के लिए पूर्ण पुनरावृत्ति
  • 1 PMID के लिए पूर्ण पुनरावृत्ति
  • 2 PMID के लिए पूर्ण पुनरावृत्ति
  • 3 PMID के लिए पूर्ण पुनरावृत्ति
  • 4 PMID के लिए पूर्ण पुनरावृत्ति
  • 5 PMID के लिए पूर्ण पुनरावृत्ति
  • और यह तब तक लिखता है जब तक कि नीचे दिया गया अपवाद प्रकट न हो जाए ...

तो लूप में किसी भी यादृच्छिक बिंदु पर, मुझे नीचे अपवाद मिलता है।

java.io.FileNotFoundException: https://dtd.nlm.nih। gov/ncbi/pubmed/out/pubmed_190101.dtd sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1890) पर sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492) पर sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:263) पर com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:647) पर com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startEntity(XMLEntityManager.java:1304) पर com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startDTDEntity(XMLEntityManager.java:1270) पर com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl.setInputSource(XMLDTDScannerImpl.java:264) पर com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDriver.dispatch(XMLDocumentScannerImpl.java:1161) पर com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDriver.next (XMLDocumentScannerImpl.java:1045) पर com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:959) पर com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:602) पर com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:505) पर com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:842) पर com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:771) पर com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141) पर com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:243) पर com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse (DocumentBuilderImpl.java:339) पर javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:121) पर pmidtomeshConverter.Convert2MeSH.parseXML पर (Convert2MeSH.java:240) pmidtomeshConverter.Convert2MeSH.main (Convert2MeSH.java:121) पर

2
Anjani Dhrangadhariya 18 पद 2018, 18:40

2 जवाब

सबसे बढ़िया उत्तर

मानचित्र का उपयोग करने की कोई आवश्यकता नहीं है; बस सीधे फाइल में लिखें। बेहतर प्रदर्शन के लिए BufferedWriter का उपयोग करें।

मैं यह भी जांचूंगा कि सर्वर साइड पर कोई दर सीमा या उस प्रकृति का कुछ भी नहीं है (आप अनुमान लगा सकते हैं कि आपको जो त्रुटि मिल रही है)। पार्सिंग या डाउनलोडिंग विफल होने पर प्रतिक्रिया को एक अलग फ़ाइल में सहेजें, इस तरह आप समस्या का बेहतर निदान कर पाएंगे।

मैं पुनरारंभ तंत्र को लागू करने में भी कुछ समय लगाऊंगा, जैसे कि आप हर बार शुरुआत से शुरू करने के बजाय अंतिम असफल स्थान से प्रक्रिया को पुनरारंभ कर सकते हैं। यह पहले एन अनुरोधों को छोड़ने के लिए इनपुट के रूप में एक स्किप काउंटर प्रदान करने जितना आसान हो सकता है।

आपको DocumentBuilderFactory का पुन: उपयोग करना चाहिए ताकि यह हर बार समान DTD लोड न करे। इसके अतिरिक्त आप डीटीडी सत्यापन को पूरी तरह से अक्षम करना चाह सकते हैं (जब तक कि आप केवल वैध दस्तावेज नहीं चाहते हैं, इस मामले में उस अपवाद को पकड़ना और खराब एक्सएमएल को समीक्षा के लिए एक अलग फ़ाइल में डंप करना अच्छा है)।

private static DocumentBuilderFactory dbf;

public static void main(String[] args) {
    dbf = DocumentBuilderFactory.newInstance();
    dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
    dbf.setFeature("http://xml.org/sax/features/validation", false);
    ...
}

private static Document parseXML(URL url) throws ParserConfigurationException, SAXException, IOException {
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document doc = db.parse((url).openStream());
    doc.getDocumentElement().normalize();
    return doc;
}
3
rustyx 18 पद 2018, 19:14

आप चाहते हैं कि आपका पार्सर उन्हें पार्स करते समय डीटीडी को अनदेखा कर दे।

इस सुविधा का प्रयोग करें:

dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);

अन्य सुविधाओं के लिए Xerces प्रलेखन देखें।

5
alain.janinm 18 पद 2018, 18:56