[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-xml-kakie-vy-znaete-metody-chteniya-xml-opishite-silnye-i-slabye-storony-kazhdogo-metoda":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":15,"progress":16,"seo":17},1276,"kakie-vy-znaete-metody-chteniya-xml-opishite-silnye-i-slabye-storony-kazhdogo-metoda",41,"xml","XML","📝","Какие вы знаете методы чтения XML? Опишите сильные и слабые стороны каждого метода.","В Java существуют три основных метода чтения XML-документов: DOM (объектный), SAX (событийный) и StAX (потоковый). Каждый из них предлагает разный баланс между удобством использования, потреблением памяти и скоростью работы.\n\n### DOM (Document Object Model)\n\nDOM-парсер считывает весь XML-документ и воссоздает его в памяти в виде дерева объектов (узлов). Каждый узел может иметь дочерние узлы, формируя иерархическую структуру, по которой можно перемещаться в любом направлении.\n\n### SAX (Simple API for XML)\n\nSAX-парсер читает документ последовательно и генерирует события (открытие тега, закрытие тега, текст, атрибут), вызывая зарегистрированные обработчики. Документ в памяти не сохраняется — обработка идет «на лету».\n\n### StAX (Stream API for XML)\n\nStAX — потоковый парсер, работающий по принципу pull-модели: приложение само запрашивает следующий элемент, а не ожидает обратного вызова, как в SAX. Предоставляет два API: низкоуровневый cursor API и высокоуровневый event iterator API.\n\n### Сравнение методов\n\n| Критерий | DOM | SAX | StAX |\n|----------|-----|-----|------|\n| Модель | Дерево в памяти | Push (события → callback) | Pull (приложение запрашивает) |\n| Потребление памяти | Высокое (весь документ) | Низкое | Низкое |\n| Скорость | Низкая | Высокая | Высокая |\n| Навигация | Произвольная (любой узел) | Только вперед | Только вперед |\n| Сложность кода | Простой | Сложный (state machine) | Умеренный |\n| Чтение | Да | Да | Да |\n| Запись | Да | Нет | Нет |\n| Перекрестные ссылки | Легко (два прохода) | Сложно (ручное хранение) | Сложно |\n| Обработка ошибок | Полуструктура уничтожается автоматически | Ручная очистка | Ручная очистка |\n\n\u003Cdetails>\n\u003Csummary>Пример чтения XML через DOM\u003C\u002Fsummary>\n\n```java\nDocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();\nDocumentBuilder builder = factory.newDocumentBuilder();\nDocument document = builder.parse(new File(\"books.xml\"));\n\nNodeList books = document.getElementsByTagName(\"book\");\nfor (int i = 0; i \u003C books.getLength(); i++) {\n    Element book = (Element) books.item(i);\n    String title = book.getElementsByTagName(\"title\")\n                       .item(0).getTextContent();\n    System.out.println(\"Title: \" + title);\n}\n```\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\n\u003Csummary>Пример чтения XML через SAX\u003C\u002Fsummary>\n\n```java\nSAXParserFactory factory = SAXParserFactory.newInstance();\nSAXParser parser = factory.newSAXParser();\n\nparser.parse(new File(\"books.xml\"), new DefaultHandler() {\n    boolean inTitle = false;\n\n    @Override\n    public void startElement(String uri, String localName,\n                             String qName, Attributes attrs) {\n        if (\"title\".equals(qName)) inTitle = true;\n    }\n\n    @Override\n    public void characters(char[] ch, int start, int length) {\n        if (inTitle) {\n            System.out.println(\"Title: \" + new String(ch, start, length));\n            inTitle = false;\n        }\n    }\n});\n```\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\n\u003Csummary>Пример чтения XML через StAX\u003C\u002Fsummary>\n\n```java\nXMLInputFactory factory = XMLInputFactory.newInstance();\nXMLStreamReader reader = factory.createXMLStreamReader(\n    new FileInputStream(\"books.xml\"));\n\nwhile (reader.hasNext()) {\n    int event = reader.next();\n    if (event == XMLStreamConstants.START_ELEMENT\n            && \"title\".equals(reader.getLocalName())) {\n        System.out.println(\"Title: \" + reader.getElementText());\n    }\n}\nreader.close();\n```\n\n\u003C\u002Fdetails>\n\n> **На собеседовании:** интервьюер ждет сравнительную таблицу или четкое разграничение по памяти\u002Fскорости\u002Fудобству. Ключевое отличие SAX от StAX: SAX — push-модель (парсер вызывает ваш код), StAX — pull-модель (ваш код управляет парсером). Частая ошибка — забыть про StAX и сравнивать только DOM и SAX.","","middle",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":20,"keywords":21,"schemaAnswer":22,"featuredSnippetReady":23},"Какие вы знаете методы чтения XML? Опишите сильные и слабые  — Gymterview","В Java существуют три основных метода чтения XML-документов: DOM (объектный), SAX (событийный) и StAX (потоковый). Каждый из них предлагает разный баланс между ","В Java существуют три основных метода чтения XML-документов: DOM (объектный), SAX (событийный) и StAX (потоковый). Кажды",[7,13],"В Java существуют три основных метода чтения XML-документов: DOM (объектный), SAX (событийный) и StAX (потоковый). Каждый из них предлагает разный баланс между удобством использования, потреблением памяти и скоростью работы.",true]