Nano Hash - криптовалюты, майнинг, программирование

Создание эквивалентного вывода с помощью jaxb

Я делаю проект для клиента, где мне нужно читать XML-файлы, анализировать их, при необходимости вносить некоторые исправления и записывать их снова. Я использовал JAXB, чтобы решить эту проблему, просто разархивировав файл, работая с результирующими объектами и сортируя объекты обратно в файлы по завершении.

К сожалению, мой клиент требует, чтобы XML-файлы не изменялись, за исключением тех частей, которые намеренно изменены моей программой. Это вызывает проблемы, поскольку JAXB изменяет XML-файлы при маршаллинге, например, изменяя порядок атрибутов или перемещая определение пространства имен до корневого элемента структуры XML.

Есть ли у меня какие-либо возможности изменить выход маршаллера JAXB, чтобы он соответствовал ожиданиям моего клиента? Или, если это невозможно с помощью JAXB, существуют ли какие-либо альтернативные библиотеки XML для Java, которые могут максимально сохранить файлы XML? В настоящее время я пытаюсь использовать для этого DOM и SAX, но мне кажется, что заставить их работать так, как я хочу, очень сложно...


  • Порядок атрибутов не имеет значения, поэтому его управление не поддерживается, см. community.oracle.com/thread/ 977397. 20.01.2015
  • Проблема не столько в инструменте, сколько в самом XML. Для одного и того же документа допускается множество различных представлений (для пустых узлов, пробелов и т. д.). Самый дешевый способ для клиента - это дать ему обучение. 20.01.2015

Ответы:


1

Механизм JAXB Binder может соответствовать вашим требованиям. Когда Marshaller создает новый XML-документ, Binder применяет изменения обратно к DOM, который использовался в качестве входных данных.

import java.io.File;
import javax.xml.bind.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.*;

public class BinderDemo {

    public static void main(String[] args) throws Exception {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        File xml = new File("input.xml");
        Document document = db.parse(xml);

        JAXBContext jc = JAXBContext.newInstance(Customer.class);

        Binder<Node> binder = jc.createBinder();
        Customer customer = (Customer) binder.unmarshal(document);
        customer.getAddress().setStreet("2 NEW STREET");
        PhoneNumber workPhone = new PhoneNumber();
        workPhone.setType("work");
        workPhone.setValue("555-WORK");
        customer.getPhoneNumbers().add(workPhone);
        binder.updateXML(customer);

        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer t = tf.newTransformer();
        t.transform(new DOMSource(document), new StreamResult(System.out));
    }

}

Для получения дополнительной информации

Я написал больше о Binder JAXB в своем блоге:

22.01.2015
  • Вау, это действительно крутая функция JAXB. Единственная проблема в том, что данных в DOM недостаточно для моих требований. DOM по-прежнему меняет некоторые вещи, например порядок атрибутов. Или мне не хватает функции DOM, которая позволяет мне сохранять порядок? 22.01.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..