2010-08-17 16 views
8

मैं कुछ अच्छी तरह से गठित एक्सएमएल को डीओएम में पार्स करना चाहता हूं, लेकिन मैं मूल मीडिया में प्रत्येक नोड के टैग का ऑफसेट जानना चाहता हूं।जावा एक्सएमएल पार्सिंग और मूल बाइट ऑफ़सेट

उदाहरण के लिए, अगर मैं की तरह सामग्री कुछ के साथ एक XML दस्तावेज था:

<html> 
<body> 
<div>text</div> 
</body> 
</html> 

मुझे पता है कि नोड शुरू होता है पर मूल मीडिया में 13 ऑफसेट, और (अधिक महत्वपूर्ण) करना चाहते हैं कि "टेक्स्ट" ऑफसेट पर शुरू होता है 18.

क्या यह मानक जावा एक्सएमएल पार्सर्स के साथ संभव है? JAXB? यदि कोई समाधान आसानी से उपलब्ध नहीं है, तो इसे संभव बनाने के लिए पार्सिंग पथ के साथ किस प्रकार के बदलाव आवश्यक हैं?

+0

बड़े एक्सएमएल फाइल और कैसे JAXB के साथ उपयोग करने के लिए चरित्र ऑफसेट खोजने के लिए इस सवाल http://stackoverflow.com/questions/43366566 पर एक नजर डालें। – jschnasse

उत्तर

4

SAX API इस के लिए एक अस्पष्ट तंत्र प्रदान करता है - org.xml.sax.Locator इंटरफ़ेस। जब आप SAX एपीआई का उपयोग करते हैं, तो आप DefaultHandler उपclass और SAX पार्स विधियों को पास करते हैं, और SAX पार्सर कार्यान्वयन Locator को DefaultHandler में setDocumentLocator() के माध्यम से इंजेक्ट करना है। पार्स आय के रूप में, अपने ContentHandler लागू कर रहे हैं पर विभिन्न कॉलबैक विधियों (startElement() जैसे), इसके बाद से आप Locator परामर्श

तकनीकी तौर पर (getColumnNumber() और getLineNumber() के माध्यम से) पार्स स्थिति पता लगाने के लिए कर सकते हैं, यह वैकल्पिक कार्यक्षमता है, लेकिन जावाडोक का कहना है कि इसे प्रदान करने के लिए कार्यान्वयन "दृढ़ता से प्रोत्साहित" किए जाते हैं, इसलिए आप अनुमान लगा सकते हैं कि जावाएसई में बनाया गया SAX पार्सर ऐसा करेगा।

बेशक, इसका मतलब एसएक्स एपीआई का उपयोग करना है, जो कि मस्ती का कोई विचार नहीं है, लेकिन मुझे उच्च-स्तरीय एपीआई का उपयोग करके इस जानकारी तक पहुंचने का कोई तरीका नहीं दिखाई दे रहा है।

संपादित करें: this example मिला।

1

स्थान ऑब्जेक्ट को वापस करने के लिए XML स्ट्रीमreader और इसकी getLocation() विधि का उपयोग करें। location.getCharacterOffset() वर्तमान स्थान के बाइट ऑफ़सेट देता है।

import javax.xml.stream.Location; 
import javax.xml.stream.XMLInputFactory; 
import javax.xml.stream.XMLStreamReader; 

public class Runner { 

public static void main(String argv[]) { 

    XMLInputFactory factory = XMLInputFactory.newInstance(); 
    try{ 
    XMLStreamReader streamReader = factory.createXMLStreamReader(
      new FileReader("D:\\BigFile.xml")); 

    while(streamReader.hasNext()){ 
     streamReader.next(); 
     if(streamReader.getEventType() == XMLStreamReader.START_ELEMENT){ 
      Location location = streamReader.getLocation(); 
      System.out.println("byte location: " + location.getCharacterOffset()); 
      } 
     } 
    } catch(Exception e){ 
     e.printStackTrace(); 
    } 
संबंधित मुद्दे