Похоже, он денормализует вывод и включает контекст пространства имен вместе с узлами, которым действительно нужен контекст пространства имен.
Например, веб-страница для этого вопроса содержит встроенное пространство имен CreativeCommons:
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:thr="http://purl.org/syndication/thread/1.0">
<!-- snip -->
<creativeCommons:license>http://www.creativecommons.org/licenses/by-nc/2.5/rdf</creativeCommons:license>
<!-- snip -->
</feed>
Когда вы выводите xml с помощью этого скрипта:
def root = new XmlParser().parseText("http://stackoverflow.com/feeds/question/227447".toURL().text)
println new XmlNodePrinter().print(root)
В конечном итоге пространство имен перемещается на узел лицензии, которому это пространство имен требуется. В этом случае это не имеет большого значения, так как в этом пространстве имен есть только один узел. Если бы большая часть XML была разделена по пространствам имен, это, вероятно, привело бы к еще большему раздуванию.
<feed xmlns="http://www.w3.org/2005/Atom">
<!-- snip -->
<creativeCommons:license xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule">
http://www.creativecommons.org/licenses/by-nc/2.5/rdf
</creativeCommons:license>
<!-- snip -->
</feed>
Если вы действительно хотите, чтобы узлы были нормализованы, вам нужно будет внести некоторые изменения в XmlNodePrinter, чтобы выполнить 2 прохода через XML, во-первых, чтобы собрать все используемые пространства имен, а во-вторых, чтобы вывести их вверху, а не внутри каждого узла пространства имен. Исходный код groovy на самом деле довольно удобочитаем, и его не так сложно изменить, если вам это действительно нужно.
person
Ted Naleid
schedule
23.10.2008