XOM и канонический XML
Я делаю Java-приложение, которое проверяет, является ли XML-файл уже Canonical или не использует XOM.
В моих тестах у меня есть следующий файл, который уже Canonical.
<doc xmlns="http://example.com/default" xmlns:x="http://example.com/x">
<a a1="1" a2="2">123</a>
<b xmlns:y="http://example.com/y" a3=""3"" y:a1="1" y:a2="2"></b>
</doc>
Вот код, когда я загружаю его снова с XOM.
<?xml version="1.0"?>
<doc xmlns="http://example.com/default" xmlns:x="http://example.com/x">
<a a1="1" a2="2">123</a>
<b xmlns:y="http://example.com/y" a3=""3"" y:a1="1" y:a2="2" />
</doc>
Как видите, он снова добавляет тег XML и удаляет закрывающий тег. </b>
потому что значение тега b пусто. У меня нет проблем с тегом версии XML, но я не знаю, что делать, чтобы сохранить закрывающий тег </b>
когда я загружаю канонический документ из файла.
1 ответ
Похоже, что вы выводите документ с помощью XOM Serializer, вам нужно использовать XOM Canonicalizer для вывода вашего XML-документа и сохранить его Canonical
Это дает вывод:
<?xml version="1.0" encoding="UTF-8"?>
<doc xmlns="http://example.com/default" xmlns:x="http://example.com/x">
<a a1="1" a2="2">123</a>
<b a3=""3"" y:a1="1" y:a2="2" xmlns:y="http://example.com/y"/>
</doc>
В следующем примере программа выведет ваш XML Cannonically в System.out с использованием XOM Canonicalizer.
package com.foo.bar.xom;
import java.io.IOException;
import nu.xom.Builder;
import nu.xom.canonical.Canonicalizer;
import nu.xom.Document;
import nu.xom.ParsingException;
import nu.xom.Serializer;
import nu.xom.ValidityException;
public class App
{
public static void main(String[] args) throws ValidityException, ParsingException, IOException
{
Builder builder = new Builder();
//Serializer serializer = new Serializer(System.out);
Canonicalizer canonicalizer = new Canonicalizer(System.out, Canonicalizer.EXCLUSIVE_XML_CANONICALIZATION);
//this assumes to your xml document is on the classpath in this package as my.xml
Document input = builder.build(App.class.getResourceAsStream("my.xml"), null);
//serializer.write(input);
canonicalizer.write(input);
}
}