खोज…


टिप्पणियों

XML पार्सिंग समझदार निर्माणों का उपयोग करके अपनी सामग्री में हेरफेर करने के लिए XML दस्तावेज़ों की व्याख्या है, वे "नोड्स", "एट्रिब्यूट्स", "डॉक्यूमेंट्स", "नेमस्पेस" या इन कंस्ट्रक्ट्स से संबंधित घटनाओं के हैं।

जावा में XML दस्तावेज़ हैंडलिंग के लिए एक मूल एपीआई है, जिसे JAXP कहा जाता है , या XML प्रसंस्करण के लिए जावा एपीआई । जावा 1.4 (JAXP v1.1) के बाद से JAXP और एक संदर्भ कार्यान्वयन को हर जावा रिलीज के साथ बंडल किया गया है और तब से विकसित हुआ है। जावा 8 को JAXP संस्करण 1.6 के साथ शिप किया गया।

एपीआई XML दस्तावेजों के साथ बातचीत के विभिन्न तरीके प्रदान करता है, जो हैं:

  • DOM इंटरफ़ेस (दस्तावेज़ ऑब्जेक्ट मॉडल)
  • SAX इंटरफ़ेस (XML के लिए सरल API)
  • Stax इंटरफ़ेस (XML के लिए स्ट्रीमिंग एपीआई)

DOM इंटरफ़ेस के सिद्धांत

DOM इंटरफ़ेस का लक्ष्य XML की व्याख्या करने के लिए W3C DOM कंप्लेंट तरीका प्रदान करना है। JAXP के विभिन्न संस्करणों ने विनिर्देश के विभिन्न DOM स्तरों (स्तर 3 तक) का समर्थन किया है।

दस्तावेज़ ऑब्जेक्ट मॉडल इंटरफ़ेस के तहत, XML दस्तावेज़ को "दस्तावेज़ तत्व" के साथ शुरू करते हुए, एक पेड़ के रूप में दर्शाया जाता है। एपीआई का आधार प्रकार Node प्रकार है, यह एक Node से अपने माता-पिता, उसके बच्चों या उसके भाई-बहनों को नेविगेट करने की अनुमति देता है (हालांकि, सभी Node बच्चे नहीं हो सकते हैं, उदाहरण के लिए, पेड़ में Text नोड्स अंतिम हैं, और कभी संतान नहीं होती)। XML टैग्स को Element s के रूप में दर्शाया गया है, जो विशेष रूप से विशेषता-संबंधित विधियों के साथ Node विस्तार करते हैं।

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

SAX इंटरफ़ेस के सिद्धांत

एसएएक्स एपीआई एक्सएमएल दस्तावेजों से निपटने के लिए एक घटना-उन्मुख एपीआई है। इस मॉडल के तहत, XML दस्तावेज़ों के घटकों की घटनाओं के रूप में व्याख्या की जाती है (उदाहरण के लिए "एक टैग खोला गया है", "एक टैग बंद हो गया है", "एक पाठ नोड का सामना किया गया है", "एक टिप्पणी का सामना किया गया है")। ..

एसएएक्स एपीआई एक "पुश पार्सिंग" दृष्टिकोण का उपयोग करता है, जहां एक एसएएक्स Parser एक्सएमएल दस्तावेज़ की व्याख्या करने के लिए जिम्मेदार है, और एक्सएमएल दस्तावेज़ में जो भी घटना मिलती है, उससे निपटने के लिए एक प्रतिनिधि (एक ContentHandler ) पर तरीकों को आमंत्रित करता है। आमतौर पर, कोई कभी भी एक पार्सर नहीं लिखता है, लेकिन एक एक्सएमएल दस्तावेज़ से सभी आवश्यक informations इकट्ठा करने के लिए एक हैंडलर प्रदान करता है।

SAX इंटरफ़ेस DOM इंटरफ़ेस की सीमाओं को पारसर स्तर पर केवल न्यूनतम आवश्यक डेटा (जैसे नामस्थान संदर्भों, सत्यापन स्थिति) को ध्यान में रखते हुए समाप्त करता है, इसलिए, केवल informations जो ContentHandler द्वारा रखे गए हैं - जिसके लिए आप, डेवलपर जिम्मेदार हैं - जिम्मेदार हैं - स्मृति में आयोजित। ट्रेडऑफ़ यह है कि इस तरह के दृष्टिकोण के साथ "समय में वापस जाने / एक्सएमएल दस्तावेज़" का कोई तरीका नहीं है: जबकि डोम एक Node को अपने माता-पिता को वापस जाने की अनुमति देता है, एसएएक्स में ऐसी कोई संभावना नहीं है।

Stax इंटरफ़ेस के सिद्धांत

Stax API, XML को SAX API (जो कि घटना से प्रेरित है) के रूप में संसाधित करने के लिए एक समान दृष्टिकोण लेता है, केवल बहुत ही महत्वपूर्ण अंतर यह है कि Stax एक पुल पार्सर है (जहाँ SAX एक पुश पार्सर था)। SAX में, Parser नियंत्रण में है, और पर कॉलबैक का उपयोग करता ContentHandler । Stax में, आप पार्सर को कॉल करते हैं, और जब आप अगला XML "इवेंट" प्राप्त करना चाहते हैं, तो नियंत्रित करें।

एपीआई XMLStreamReader (या XMLEventReader ) के साथ शुरू होता है, जो गेटवे हैं, जिसके माध्यम से डेवलपर nextEvent() -स्टाइल तरीके से पूछ सकता है।

DOM API का उपयोग करके किसी दस्तावेज़ को पार्स करना और नेविगेट करना

निम्नलिखित दस्तावेज़ को ध्यान में रखते हुए:

<?xml version='1.0' encoding='UTF-8' ?>
<library>
   <book id='1'>Effective Java</book>
   <book id='2'>Java Concurrency In Practice</book>
</library>

एक String से एक DOM ट्री बनाने के लिए निम्न कोड का उपयोग कर सकते हैं:

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.StringReader;

public class DOMDemo {

public static void main(String[] args) throws Exception {
    String xmlDocument = "<?xml version='1.0' encoding='UTF-8' ?>"
            + "<library>"
            + "<book id='1'>Effective Java</book>"
            + "<book id='2'>Java Concurrency In Practice</book>"
            + "</library>";

    DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
    // This is useless here, because the XML does not have namespaces, but this option is usefull to know in cas
    documentBuilderFactory.setNamespaceAware(true);
    DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
    // There are various options here, to read from an InputStream, from a file, ...
    Document document = documentBuilder.parse(new InputSource(new StringReader(xmlDocument)));

    // Root of the document
    System.out.println("Root of the XML Document: " + document.getDocumentElement().getLocalName());

    // Iterate the contents
    NodeList firstLevelChildren = document.getDocumentElement().getChildNodes();
    for (int i = 0; i < firstLevelChildren.getLength(); i++) {
        Node item = firstLevelChildren.item(i);
        System.out.println("First level child found, XML tag name is: " + item.getLocalName());
        System.out.println("\tid attribute of this tag is : " + item.getAttributes().getNamedItem("id").getTextContent());
    }

    // Another way would have been
    NodeList allBooks = document.getDocumentElement().getElementsByTagName("book");
}
}

कोड निम्न पैदावार देता है:

Root of the XML Document: library
First level child found, XML tag name is: book
id attribute of this tag is : 1
First level child found, XML tag name is: book
id attribute of this tag is : 2

StAX API का उपयोग करके किसी दस्तावेज़ को पार्स करना

निम्नलिखित दस्तावेज़ को ध्यान में रखते हुए:

<?xml version='1.0' encoding='UTF-8' ?>
<library>
   <book id='1'>Effective Java</book>
   <book id='2'>Java Concurrency In Practice</book>
   <notABook id='3'>This is not a book element</notABook>
</library>

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

import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamReader;
import java.io.StringReader;
import java.util.HashMap;
import java.util.Map;

public class StaxDemo {

public static void main(String[] args) throws Exception {
    String xmlDocument = "<?xml version='1.0' encoding='UTF-8' ?>"
            + "<library>"
                + "<book id='1'>Effective Java</book>"
                + "<book id='2'>Java Concurrency In Practice</book>"
                + "<notABook id='3'>This is not a book element </notABook>"
            + "</library>";

    XMLInputFactory xmlInputFactory = XMLInputFactory.newFactory();
    // Various flavors are possible, e.g. from an InputStream, a Source, ...
    XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(new StringReader(xmlDocument));

    Map<Integer, String> bookTitlesById = new HashMap<>();

    // We go through each event using a loop
    while (xmlStreamReader.hasNext()) {
        switch (xmlStreamReader.getEventType()) {
            case XMLStreamConstants.START_ELEMENT:
                System.out.println("Found start of element: " + xmlStreamReader.getLocalName());
                // Check if we are at the start of a <book> element
                if ("book".equals(xmlStreamReader.getLocalName())) {
                    int bookId = Integer.parseInt(xmlStreamReader.getAttributeValue("", "id"));
                    String bookTitle = xmlStreamReader.getElementText();
                    bookTitlesById.put(bookId, bookTitle);
                }
                break;
            // A bunch of other things are possible : comments, processing instructions, Whitespace...
            default:
                break;
        }
        xmlStreamReader.next();
    }

    System.out.println(bookTitlesById);
}

यह आउटपुट:

Found start of element: library
Found start of element: book
Found start of element: book
Found start of element: notABook
{1=Effective Java, 2=Java Concurrency In Practice}

इस नमूने में, किसी को कुछ चीज़ों का ध्यान रखना चाहिए:

  1. xmlStreamReader.getAttributeValue उपयोग का उपयोग करता है क्योंकि हमने पहले जाँच की है कि पार्सर START_ELEMENT राज्य में है। अन्य राज्यों में ( ATTRIBUTES को छोड़कर), Parser को IllegalStateException को फेंकने के लिए अनिवार्य है, क्योंकि विशेषताएँ केवल तत्वों की शुरुआत में दिखाई दे सकती हैं।

  2. वही xmlStreamReader.getTextContent() लिए जाता है, यह काम करता है क्योंकि हम एक START_ELEMENT और हम इस दस्तावेज़ में जानते हैं कि <book> तत्व में कोई गैर-पाठ चाइल्ड नोड नहीं है।

अधिक जटिल दस्तावेजों को पार्स करने के लिए (गहरे, नेस्टेड तत्व, ...), पार्सर को उप-विधियों या अन्य objets में "प्रतिनिधि" करना एक अच्छा अभ्यास है, उदाहरण के लिए एक BookParser वर्ग या विधि है, और यह हर तत्व से निपटता है पुस्तक के टैग के START_ELEMENT से END_ELEMENT तक।

एक भी महत्वपूर्ण डेटा के आसपास और पेड़ के नीचे रखने के लिए एक Stack ऑब्जेक्ट का उपयोग कर सकते हैं।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow