名前空間を保持したままグルーヴィーなノードを印刷するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/227447

質問

このコードを使用してXMLを出力するとき、 XmlParser

で解析(および変更)しました
XmlParser parser = new XmlParser()
def root = parser.parseText(feedUrl.toURL().text)
def writer = new StringWriter()
new XmlNodePrinter(new PrintWriter(writer)).print(root)
println writer.toString()

ルートノードの名前空間宣言は、 root toString()に存在していても出力されません...何かアイデアがありますか?

役に立ちましたか?

解決

出力を非正規化し、実際に名前空間コンテキストを必要とするノードとともに名前空間コンテキストを含めるようです。

たとえば、この質問のWebページには、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)

名前空間を必要とするライセンスノードに名前空間を移動することになります。この名前空間にはノードが1つしかないため、この場合は大した問題ではありません。 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を微調整してXMLを2回パスする必要があります。最初に使用されたすべてのネームスペースを収集し、2番目をそれぞれの内部ではなく上部に出力します名前空間付きノード。 groovyのソースコードは実際には非常に読みやすく、実際にこれが必要な場合に修正するのは難しくありません。

他のヒント

私はちょうど同じ問題を抱えていて、少しいじってから回避策を見つけました。

XmlParser の代わりに XmlSluper を使用し、 StreamingMarkupBuilder XmlNodePrinter ではなくem> 。次に、 bind のクロージャーを活用し、 mkp 組み込み変数を使用して名前空間を宣言します。

たとえば、上記のTedのソースxmlの例を使用:

def root = new XmlSlurper().parseText("http://stackoverflow.com/feeds/question/227447".toURL().text))
def outputBuilder = new StreamingMarkupBuilder()
String result = XmlUtil.serialize(outputBuilder.bind {
    mkp.declareNamespace('':'http://www.w3.org/2005/Atom')
    mkp.declareNamespace('creativeCommons':'http://backend.userland.com/creativeCommonsRssModule')
    mkp.declareNamespace('re':'http://purl.org/atompub/rank/1.0')
    mkp.yield root }
)
println result

結果:

<?xml version="1.0" encoding="UTF-8"?><feed xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns="http://www.w3.org/2005/Atom" xmlns:re="http://purl.org/atompub/rank/1.0">
<title type="text">How do I print a groovy Node with namespace preserved? - Stack Overflow </title>
<link rel="self" type="application/atom+xml" href="http://stackoverflow.com/feeds/question/227447"/>
<link rel="alternate" type="text/html" href="http://stackoverflow.com/questions/227447"/>
<subtitle>most recent 30 from stackoverflow.com</subtitle>
<updated>2011-02-16T05:13:17Z</updated>
<id>http://stackoverflow.com/feeds/question/227447</id>
<creativeCommons:license>http://www.creativecommons.org/licenses/by-nc/2.5/rdf</creativeCommons:license>
<entry>
<id>http://stackoverflow.com/questions/227447/how-do-i-print-a-groovy-node-with-namespace-preserved</id>
<re:rank scheme="http://stackoverflow.com">2</re:rank>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top