#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-файлов с разной разметкой, но идентичным отображением.