2011-02-01 13 views
19

मैं जावा में एक पार्सर की तलाश में हूं जो एसजीएमएल में स्वरूपित दस्तावेज़ को पार्स कर सकता है।जावा में एसजीएमएल पार्सर?

डुप्लिकेट पर नज़र रखता है के लिए: मैं दो अन्य सूत्र है कि इस विषय पर चर्चा के बारे में पता कर रहा हूँ: Parsing Java String with SGML Java SGML to XML conversion? लेकिन न तो एक संकल्प है, इसलिए नया विषय है।

लोगों को SGML साथ एक्सएमएल भ्रमित के लिए: कृपया इस पढ़ें: http://www.w3.org/TR/NOTE-sgml-xml-971215#null (संक्षेप में, वहाँ कम से कम यह व्यर्थ यह वेनिला रूप है में करने के लिए पर्याप्त सूक्ष्म अंतर कर रहे हैं)

लोग हैं, जो पूछ के शौकीन हैं Google को पोस्टर: मैंने पहले से ही किया है और निकटतम मैं व्यापक रूप से लोकप्रिय SAXParser के साथ आ सकता था: http://download.oracle.com/javase/1.4.2/docs/api/javax/xml/parsers/SAXParser.html लेकिन निश्चित रूप से यह एक एक्सएमएल पार्सर होना है। मैं यह देखने के लिए चारों ओर देख रहा हूं कि एसजीएमएल को समायोजित करने के लिए किसी ने एसएक्स पार्सर में संशोधन लागू किया है या नहीं।

आखिरकार, मैं एसएक्स का उपयोग नहीं कर सकता क्योंकि मैं जावा समाधान की तलाश में हूं।

धन्यवाद! यदि SGML दस्तावेज काम करने के लिए मानक SAX पार्सर के लिए काफी निकट एक्सएमएल के लिए है देखने के लिए जाँच - :)

+1

लोग अभी भी SGML का उपयोग करें? मैं वास्तव में उत्सुक हूं - आपके मामले में इसका क्या उपयोग किया जाता है? – skaffman

+0

मेरे पास लगभग 2500 दस्तावेज़ हैं जो एसजीएमएल में स्वरूपित हैं - मुझे कुछ सांख्यिकीय विश्लेषण के लिए डेटा का उपयोग करने की आवश्यकता है। मैं टैग्स के वितरण को निर्धारित करने के लिए एक त्वरित कार्यक्रम को एक साथ जोड़ रहा हूं, मैंने उनमें से कुछ को देखा और वे केवल कुछ चुनिंदा टैग का उपयोग कर रहे हैं। इस मामले में, मैं आसानी से SAXParser का उपयोग कर सकता था। – user183037

+0

मेरे पास हजारों एसजीएमएल फाइलें हैं, और अधिक समय हर समय बनाई जाती है। एसजीएमएल अभी भी प्रकाशन उद्योग में काफी व्यापक रूप से उपयोग किया जाता है, हालांकि अप्रत्याशित! – Woody

उत्तर

4

मैं इस समस्या

पहले करने के लिए कुछ दृष्टिकोण है कि तुम क्या किया है।

दूसरा HTML पार्सर्स के साथ ऐसा करना है। यहां की चाल उस व्यक्ति को ढूंढना है जो गैर-HTML तत्वों को अनदेखा नहीं करती है।

मुझे "एसजीएमएल पार्सर जावा" की खोज करते समय कुछ जावा एसजीएमएल पार्सर्स, एसेडेमिया में अधिक मिला। मुझे नहीं पता कि वे कितनी अच्छी तरह से काम करते हैं।

अंतिम चरण एक मानक (गैर जावा) एसजीएमएल पार्सर लेना और दस्तावेजों को जावा में पढ़ सकते हैं जो आप जावा में पढ़ सकते हैं।

ऐसा लगता है कि आप पहले चरण के साथ काम करने में सक्षम थे।

+1

मुझे जावा एसजीएमएल पार्सर के लिए कोई संसाधन नहीं मिला - अगर आप इसे फिर से पाते हैं तो लिंक पोस्ट कर सकते हैं - धन्यवाद! – user183037

+0

असल में जब मैंने फिर से देखा, तो मुझे कुछ भी नहीं मिला। –

+0

:) यह ठीक है - कोशिश करने के लिए धन्यवाद! – user183037

1

इस समय जावा का उपयोग कर एसजीएमएल को पार्स करने के लिए कोई एपीआई नहीं है। एसजीएमएल को एक्सएमएल में परिवर्तित करने के लिए कोई एपीआई या लाइब्रेरी नहीं है और फिर जावा का उपयोग करके इसे पार्स कर रही है। एसएमएमएल की सभी परियोजनाओं के लिए एक्सएमएल द्वारा आपूर्ति की जा रही एसजीएमएल की स्थिति के साथ, अब तक मुझे नहीं लगता कि इस क्षेत्र में हर कोई काम करेगा, लेकिन यह केवल एक अनुमान है।

Here विश्वविद्यालय से कुछ ओपन सोर्स कोड कोड है जो ऐसा करता है, हालांकि मैंने कोशिश नहीं की है और आपको अन्य आश्रित वर्गों को खोजने की आवश्यकता होगी। मेरा मानना ​​है कि जावा में एकमात्र व्यवहार्य समाधान के लिए नियमित अभिव्यक्तियों की आवश्यकता होगी।

इसके अलावा, यहां सार्वजनिक एसजीएमएल/एक्सएमएल सॉफ्टवेयर के लिए link है।

1

जावा SE javax.swing.text.html.parser पैकेज में एक HTML पार्सर भी शामिल है। यह अपने प्रलेखन में एक सामान्य एसजीएमएल पार्सर होने का दावा करता है, लेकिन फिर दस्तावेज़ीकरण में दावा करता है कि आपको केवल एचटीएमएल डीटीडी कक्षा के साथ इसका उपयोग करना चाहिए।

यदि आप इसे लेंसेंट मोड में डालते हैं और आपके एसजीएमएल दस्तावेज़ों में बहुत से अंतर्निहित अंत टैग नहीं हैं, तो आपको उचित परिणाम मिल सकते हैं। http://docs.oracle.com/javase/6/docs/api/javax/swing/text/html/parser/DocumentParser.html

इस तरह एक उदाहरण बनाएँ::

new DocumentParser(DTD.getDTD("html32")) 

या आप DocumentParser के साथ एक कस्टम DTD का उपयोग कर के खिलाफ चेतावनी की अनदेखी कर सकता है, और एक उपवर्ग बनाने

अपने JavaDoc में पदव्याख्यायित्र, यहाँ के बारे में पढ़ें डीटीडी का जो आपके स्वयं के एसजीएमएल प्रारूप के नियमों से मेल खाता है।

यह स्पष्ट रूप से औद्योगिक ताकत एसजीएमएल पार्सर नहीं है, लेकिन यह एक बार डेटा माइग्रेशन प्रयास के लिए एक अच्छा प्रारंभिक बिंदु होना चाहिए। मैंने एचटीएमएल को पार्स करने के लिए पिछली परियोजनाओं में इसे उपयोगी पाया है।

1

मैं जेएनआई के माध्यम से ओपनएसपी का उपयोग करता हूं, क्योंकि ऐसा लगता है कि कोई शुद्ध जावा एसजीएमएल पार्सर नहीं है। मैंने एक प्रयोगात्मक SAX-like wrapper लिखा है जो http://sourceforge.net/projects/sasgml पर उपलब्ध है (बेशक, इसमें जेएनआई की सभी कमीएं हैं ... लेकिन मेरी आवश्यकताओं के लिए पर्याप्त थी)।

एक और तरीका Open SP से एसएक्स का उपयोग करके दस्तावेज़ को एक्सएमएल में परिवर्तित कर रहा है, और उसके बाद पारंपरिक SAX पार्सर चलाता है।

0

हालांकि यह एक बहुत पुरानी पोस्ट है और मैं दावा नहीं कर रहा हूं कि जो उत्तर मैं प्रदान कर रहा हूं वह सही है लेकिन यह मेरे उद्देश्य की सेवा करता है। इसलिए मैं इस मामले को अपने मामले में डेटा प्राप्त करने के लिए स्टैक का उपयोग करके लिखा था। मुझे आशा है कि यह दूसरों के लिए सहायक हो सकता है।

try (BufferedReader br = new BufferedReader(new FileReader(new File(
       fileName)))) { 
      while ((line = br.readLine()) != null) { 
       line = line.trim(); 
       int startOfTag = line.indexOf("<"); 
       int endOfTag = line.indexOf(">"); 
       String currentTag = ""; 

       if (startOfTag > -1 && endOfTag > -1) { 
        if (countStart) 
         headerTagsCounter++; 
        currentTag = line.substring(startOfTag + 1, endOfTag); 
        String currentData = line.substring(endOfTag + 1, 
          line.length()); 
        if (i == 1) { 
         tagStack.push(currentTag); 
         i++; 
        } 
        if (currentData.isEmpty() || currentData == "") {//If there is no data, its a parent tag... 
         if (!currentTag.contains("/")) {// if its an opening tag... 
          switch (currentTag) {// these tags are useless in my case, so just skipping these tags. 
          case "CORRECTION": 
          case "PAPER": 
          case "PRIVATE-TO-PUBLIC": 
          case "DELETION": 
          case "CONFIRMING-COPY": 
          case "CAPTION": 
          case "STUB": 
          case "COLUMN": 
          case "TABLE-FOOTNOTES-SECTION": 
          case "FOOTNOTES": 
          case "PAGE": 
           break; 
          default: { 
           countStart = false; 
           int tagCounterNumber = 0; 
           String historyTagToRemove = ""; 
           for (String historyTag : historyStack) { 
            String tagCounter = ""; 
            if (historyTag.contains(currentTag)) {//if it's a repeating tag..Append the counter and update the same in history tag.. 
             historyTagToRemove = historyTag; 
             if (historyTag 
               .equalsIgnoreCase(currentTag)) { 
              tagCounterNumber = 1; 
             } else if (historyTag.length() > currentTag 
               .length()) { 
              tagCounter = historyTag 
                .substring(currentTag 
                  .length()); 
              if (tagCounter != null 
                && !tagCounter.isEmpty()) { 
               tagCounterNumber = Integer 
                 .parseInt(tagCounter) + 1; 
              } 
             } 
            } 
           } 
           if (tagCounterNumber > 0) 
            currentTag += tagCounterNumber; 
           if (historyTagToRemove != null 
             && !historyTagToRemove.isEmpty()) { 
            historyStack.remove(historyTagToRemove); 
            historyStack.push(currentTag); 
           } 
           tagStack.push(currentTag); 
           break; 
          } 
          } 
         } else// if its end of a tag... Match the current tag with top of stack and if its a match, pop it out 
         { 
          currentTag = currentTag.substring(1); 
          String tagRemoved = ""; 
          String topStackTag = tagStack.lastElement(); 
          if (topStackTag.contains(currentTag)) { 
           tagRemoved = tagStack.pop(); 
           historyStack.push(tagRemoved); 
          } 
          if (tagStack.size() < 2) 
           cik = ""; 
          if (tagStack.size() == 2 && cik != null 
            && !cik.isEmpty()) 
           for (int j = headerTagsCounter - 1; j < tagList.size(); j++) { 
            String item = tagList.get(j); 
            if (!item.contains("@@")) { 
             item += "@@" + cik; 
             tagList.remove(j); 
             tagList.add(j, item); 
            } 
           } 
         } 
        } else {// if current tag has some data... 
         currentData = currentData.trim(); 
         String stackValue = ""; 
         for (String tag : tagStack) { 
          if (stackValue != null && !stackValue.isEmpty() 
            && stackValue != "") 
           stackValue = stackValue + "||" + tag; 
          else 
           stackValue = tag; 
         } 
         switch (currentTag) { 
         case "ACCESSION-NUMBER": 
          accessionNumber = currentData; 
          break; 
         case "FILING-DATE": 
          dateFiled = currentData; 
          break; 
         case "TYPE": 
          formType = currentData; 
          break; 
         case "CIK": 
          cik = currentData; 
          break; 
         } 
         tagList.add(stackValue + "$$" + currentTag + "::"+ currentData); 
        } 
       } 
      } 
// Now all your data is available with in tagList, stack is separated by ||, key is separated by $$ and value is separated by :: 
      } 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
     } 

    } 

आउटपुट: कोड के http://10k-staging.s3.amazonaws.com/edgar0105/2016/12/20/935015/000119312516799070/0001193125-16-799070.hdr.sgml

आउटपुट::

फ़ाइल के स्रोत

SEC-HEADER$$SEC-HEADER::0001193125-16-799070.hdr.sgml : 20161220 
SEC-HEADER$$ACCEPTANCE-DATETIME::20161220172458 
SEC-HEADER$$ACCESSION-NUMBER::0001193125-16-799070 
SEC-HEADER$$TYPE::485APOS 
SEC-HEADER$$PUBLIC-DOCUMENT-COUNT::9 
SEC-HEADER$$FILING-DATE::20161220 
SEC-HEADER$$DATE-OF-FILING-DATE-CHANGE::20161220 
SEC-HEADER||FILER||COMPANY-DATA$$CONFORMED-NAME::ARTISAN PARTNERS FUNDS [email protected]@0000935015 
SEC-HEADER||FILER||COMPANY-DATA$$CIK::[email protected]@0000935015 
SEC-HEADER||FILER||COMPANY-DATA$$IRS-NUMBER::[email protected]@0000935015 
SEC-HEADER||FILER||COMPANY-DATA$$STATE-OF-INCORPORATION::[email protected]@0000935015 
SEC-HEADER||FILER||COMPANY-DATA$$FISCAL-YEAR-END::[email protected]@0000935015 
SEC-HEADER||FILER||FILING-VALUES$$FORM-TYPE::[email protected]@0000935015 
SEC-HEADER||FILER||FILING-VALUES$$ACT::[email protected]@0000935015 
SEC-HEADER||FILER||FILING-VALUES$$FILE-NUMBER::[email protected]@0000935015 
SEC-HEADER||FILER||FILING-VALUES$$FILM-NUMBER::[email protected]@0000935015 
SEC-HEADER||FILER||BUSINESS-ADDRESS$$STREET1::875 EAST WISCONSIN AVE STE [email protected]@0000935015 
SEC-HEADER||FILER||BUSINESS-ADDRESS$$CITY::[email protected]@0000935015 
SEC-HEADER||FILER||BUSINESS-ADDRESS$$STATE::[email protected]@0000935015 
SEC-HEADER||FILER||BUSINESS-ADDRESS$$ZIP::[email protected]@0000935015 
SEC-HEADER||FILER||BUSINESS-ADDRESS$$PHONE::[email protected]@0000935015 
SEC-HEADER||FILER||MAIL-ADDRESS$$STREET1::875 EAST WISCONSIN AVE STE [email protected]@0000935015 
SEC-HEADER||FILER||MAIL-ADDRESS$$CITY::[email protected]@0000935015 
SEC-HEADER||FILER||MAIL-ADDRESS$$STATE::[email protected]@0000935015 
SEC-HEADER||FILER||MAIL-ADDRESS$$ZIP::[email protected]@0000935015 
SEC-HEADER||FILER||FORMER-COMPANY$$FORMER-CONFORMED-NAME::ARTISAN FUNDS [email protected]@0000935015 
SEC-HEADER||FILER||FORMER-COMPANY$$DATE-CHANGED::[email protected]@0000935015 
SEC-HEADER||FILER||FORMER-COMPANY1$$FORMER-CONFORMED-NAME::ZIEGLER FUNDS [email protected]@0000935015 
SEC-HEADER||FILER||FORMER-COMPANY1$$DATE-CHANGED::[email protected]@0000935015 
SEC-HEADER||FILER1||COMPANY-DATA1$$CONFORMED-NAME::ARTISAN PARTNERS FUNDS [email protected]@0000935015 
SEC-HEADER||FILER1||COMPANY-DATA1$$CIK::[email protected]@0000935015 
SEC-HEADER||FILER1||COMPANY-DATA1$$IRS-NUMBER::[email protected]@0000935015 
SEC-HEADER||FILER1||COMPANY-DATA1$$STATE-OF-INCORPORATION::[email protected]@0000935015 
SEC-HEADER||FILER1||COMPANY-DATA1$$FISCAL-YEAR-END::[email protected]@0000935015 
SEC-HEADER||FILER1||FILING-VALUES1$$FORM-TYPE::[email protected]@0000935015 
SEC-HEADER||FILER1||FILING-VALUES1$$ACT::[email protected]@0000935015 
SEC-HEADER||FILER1||FILING-VALUES1$$FILE-NUMBER::[email protected]@0000935015 
SEC-HEADER||FILER1||FILING-VALUES1$$FILM-NUMBER::[email protected]@0000935015 
SEC-HEADER||FILER1||BUSINESS-ADDRESS1$$STREET1::875 EAST WISCONSIN AVE STE [email protected]@0000935015 
SEC-HEADER||FILER1||BUSINESS-ADDRESS1$$CITY::[email protected]@0000935015 
SEC-HEADER||FILER1||BUSINESS-ADDRESS1$$STATE::[email protected]@0000935015 
SEC-HEADER||FILER1||BUSINESS-ADDRESS1$$ZIP::[email protected]@0000935015 
SEC-HEADER||FILER1||BUSINESS-ADDRESS1$$PHONE::[email protected]@0000935015 
SEC-HEADER||FILER1||MAIL-ADDRESS1$$STREET1::875 EAST WISCONSIN AVE STE [email protected]@0000935015 
SEC-HEADER||FILER1||MAIL-ADDRESS1$$CITY::[email protected]@0000935015 
SEC-HEADER||FILER1||MAIL-ADDRESS1$$STATE::[email protected]@0000935015 
SEC-HEADER||FILER1||MAIL-ADDRESS1$$ZIP::[email protected]@0000935015 
SEC-HEADER||FILER1||FORMER-COMPANY2$$FORMER-CONFORMED-NAME::ARTISAN FUNDS [email protected]@0000935015 
SEC-HEADER||FILER1||FORMER-COMPANY2$$DATE-CHANGED::[email protected]@0000935015 
SEC-HEADER||FILER1||FORMER-COMPANY3$$FORMER-CONFORMED-NAME::ZIEGLER FUNDS [email protected]@0000935015 
SEC-HEADER||FILER1||FORMER-COMPANY3$$DATE-CHANGED::[email protected]@0000935015 
SEC-HEADER||SERIES-AND-CLASSES-CONTRACTS-DATA||NEW-SERIES-AND-CLASSES-CONTRACTS$$OWNER-CIK::0000935015 
SEC-HEADER||SERIES-AND-CLASSES-CONTRACTS-DATA||NEW-SERIES-AND-CLASSES-CONTRACTS||NEW-SERIES$$SERIES-ID::S000056665 
SEC-HEADER||SERIES-AND-CLASSES-CONTRACTS-DATA||NEW-SERIES-AND-CLASSES-CONTRACTS||NEW-SERIES$$SERIES-NAME::Artisan Thematic Fund 
SEC-HEADER||SERIES-AND-CLASSES-CONTRACTS-DATA||NEW-SERIES-AND-CLASSES-CONTRACTS||NEW-SERIES||CLASS-CONTRACT$$CLASS-CONTRACT-ID::C000179292 
SEC-HEADER||SERIES-AND-CLASSES-CONTRACTS-DATA||NEW-SERIES-AND-CLASSES-CONTRACTS||NEW-SERIES||CLASS-CONTRACT$$CLASS-CONTRACT-NAME::Investor Shares 
संबंधित मुद्दे