XOM и канонический XML - PullRequest
       43

XOM и канонический XML

0 голосов
/ 16 июня 2011

Я делаю Java-приложение, которое проверяет, является ли файл XML уже Каноническим или не использует 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="&quot;3&quot;" 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="&quot;3&quot;" y:a1="1" y:a2="2" />
</doc>

Как видите, он снова добавляет тег xml и удаляет закрывающий тег </b>, поскольку значение тега b пусто. У меня нет проблем с тегом версии XML, но я не знаю, что делать, чтобы сохранить закрывающий тег </b> при загрузке канонического документа из файла.

1 Ответ

3 голосов
/ 18 апреля 2012

Похоже, что вы выводите документ с помощью 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="&quot;3&quot;" 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);

    }
}
...