проверка, совпадают ли два svg-файла

#java #svg

#java #svg

Вопрос:

Мне нужно придумать способ определить, совпадают ли два SVG-файла, используя Java. Я не слишком знаком с тем, как работает SVG, но я полагаю, что файл-> строка и сравнение строк — это не правильный путь — есть порядок элементов, некоторые необязательные параметры могут быть опущены, что-то в этом роде. Как бы мне лучше всего это сделать?

В случае, если это имеет значение — мне это нужно для тестирования конвертера SVG<->CGM, который делает коллега. Я думал о том, чтобы выполнить преобразование SVG-> CGM-> SVG туда и обратно и сравнить конечный результат с исходным SVG. Это правильный способ протестировать такой конвертер, верно?

Комментарии:

1. Как насчет записи обоих изображений SVG на холст с помощью drawImage, а затем сравнения двух изображений пиксель за пикселем.

2. Полагаю, я мог бы попробовать это. Однако сравнение двух изображений попиксельно звучит не очень быстро. Есть ли какие-либо хорошие способы сравнения на основе содержимого XML файлов? В этом случае это будет сравнение xml.

3. Вот как работает reftest-analyzer, и это практически мгновенно. Он принимает ошибки reftest, которые кодируются как два изображения base64, и сравнивает их: view-source://people.mozilla.org/~tmielczarek/reftest-analyzer.xhtml

Ответ №1:

Вы можете использовать XML-Unit для сравнения двух XML-файлов. Чтобы получить XML-строки, вы можете прочитать файлы.

Maven импортирует:

 <dependency>
            <groupId>org.xmlunit</groupId>
            <artifactId>xmlunit-core</artifactId>
            <version>2.8.2</version>
        </dependency>

        <dependency>
            <groupId>org.xmlunit</groupId>
            <artifactId>xmlunit-matchers</artifactId>
            <version>2.8.2</version>
        </dependency>
        <dependency>
            <groupId>org.xmlunit</groupId>
            <artifactId>xmlunit-assertj3</artifactId>
            <version>2.8.2</version>
        </dependency>
        <dependency>
            <groupId>org.xmlunit</groupId>
            <artifactId>xmlunit-parent</artifactId>
            <version>2.8.2</version>
            <type>pom</type>
        </dependency>
  

Чтение в XML-строке

 String xml = new String(
    Files.readAllBytes(xmlFile.toPath()), StandardCharsets.UTF_8);
  

Проверка:

 public void isXmlEqual(String xmlString1, String xmlString2){
        
        Diff diff = DiffBuilder.compare(xmlString1).withTest(xmlString2).ignoreComments().ignoreWhitespace().build();
        Iterator<Difference> differenceIterator = diff.getDifferences().iterator();
        int differenceSize = 0;
        while (differenceIterator.hasNext()) {
            Difference difference = differenceIterator.next();
            log.info( difference.toString() );
            differenceSize  ;
        }
        if (differenceSize == 0){
            log.info( "Images are the same" );
        }
    }
  

Комментарии:

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