【问题标题】:Merge multiple XML files with Groovy使用 Groovy 合并多个 XML 文件
【发布时间】:2019-01-22 18:49:38
【问题描述】:

我对 Groovy 很陌生,实际上是昨天才发现的。我正在使用MkDocs static site generator 构建一个站点,一个新的内部要求导致我不得不将当前站点拆分为三个不同的站点容器,以确保唯一的搜索索引等等。这一切都是使用 Jenkins 处理和构建的,并且运行良好。

不幸的是,此解决方案导致我需要合并三个不同的站点地图,并建议查看 Groovy。我从Groovy - merging XML nodes 获得了大部分以下代码,除了写入我的文件的第一个站点地图之外,我没有得到任何其他结果。有什么建议可以在这里出错吗?

//Define XML objects to parse, set namespace to false.
def sm1 = new XmlSlurper( false, false ).parse(new File('C://test/site-1/sitemap.xml'))
def sm2 = new XmlSlurper( false, false ).parse(new File('C://test/site-2/sitemap.xml'))
def sm3 = new XmlSlurper( false, false ).parse(new File('C://test/site-3/sitemap.xml'))

//Define the output file.
def output = new File ('C://test/sitemap.xml')

//Append url-nodes from sitemap 2 to sitemap 1 urlset.
sm2.'**'.findAll{it.name() == 'url'}.collect{ sm1.urlset.appendNode(it)}
//Append url-nodes from sitemap 3 to sitemap 1 urlset.
sm3.'**'.findAll{it.name() == 'url'}.collect{ sm1.urlset.appendNode(it)}

//Define what to write to file.
def content = groovy.xml.XmlUtil.serialize(sm1)

//Write to file.
output.newWriter().withWriter { w ->
  w << content
}

/site-1/sitemap.xml

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url>
     <loc>https://site/</loc>
     <lastmod>2019-01-18</lastmod>
     <changefreq>daily</changefreq>
    </url>
</urlset>

/site-2/sitemap.xml

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url>
     <loc>https://site/site-2/</loc>
     <lastmod>2019-01-18</lastmod>
     <changefreq>daily</changefreq>
    </url>
    <url>
     <loc>https://site/site-2/section/</loc>
     <lastmod>2019-01-18</lastmod>
     <changefreq>daily</changefreq>
    </url>
</urlset>

/site-3/sitemap.xml

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url>
     <loc>https://site/site-3/</loc>
     <lastmod>2019-01-18</lastmod>
     <changefreq>daily</changefreq>
    </url>
    <url>
     <loc>https://site/site-3/section/</loc>
     <lastmod>2019-01-18</lastmod>
     <changefreq>daily</changefreq>
    </url>
</urlset>

预期输出

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url>
     <loc>https://site/</loc>
     <lastmod>2019-01-18</lastmod>
     <changefreq>daily</changefreq>
    </url>
    <url>
     <loc>https://site/site-2/</loc>
     <lastmod>2019-01-18</lastmod>
     <changefreq>daily</changefreq>
    </url>
    <url>
     <loc>https://site/site-2/section/</loc>
     <lastmod>2019-01-18</lastmod>
     <changefreq>daily</changefreq>
    </url>
    <url>
     <loc>https://site/site-3/</loc>
     <lastmod>2019-01-18</lastmod>
     <changefreq>daily</changefreq>
    </url>
    <url>
     <loc>https://site/site-3/section/</loc>
     <lastmod>2019-01-18</lastmod>
     <changefreq>daily</changefreq>
    </url>
</urlset>

电流输出

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url>
     <loc>https://site/</loc>
     <lastmod>2019-01-18</lastmod>
     <changefreq>daily</changefreq>
    </url>
</urlset>

【问题讨论】:

    标签: xml groovy


    【解决方案1】:

    1. xml解析变量后已经引用了根元素,所以要访问urlset标签你只需要使用sm1...而不是sm1.urlset...

    1. collect 可以工作,但在这种情况下最好使用每个

    工作代码下方:

    def sm1 = new XmlSlurper( false, false ).parseText('''<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
        <url>
         <loc>https://site/site-1/</loc>
         <lastmod>2019-01-18</lastmod>
         <changefreq>daily</changefreq>
        </url>
        <url>
         <loc>https://site/site-1/section/</loc>
         <lastmod>2019-01-18</lastmod>
         <changefreq>daily</changefreq>
        </url>
    </urlset>''')
    
    def sm2 = new XmlSlurper( false, false ).parseText('''<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
        <url>
         <loc>https://site/site-2/</loc>
         <lastmod>2019-01-18</lastmod>
         <changefreq>daily</changefreq>
        </url>
        <url>
         <loc>https://site/site-2/section/</loc>
         <lastmod>2019-01-18</lastmod>
         <changefreq>daily</changefreq>
        </url>
    </urlset>''')
    
    
    //Append url-nodes from sitemap 2 to sitemap 1 urlset.
    println sm2.url.each{println sm1.appendNode(it)}
    
    //Define what to write to file.
    def content = groovy.xml.XmlUtil.serialize(sm1)
    println content
    

    【讨论】:

    • 谢谢!删除urlset 是关键!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    • 2014-12-22
    相关资源
    最近更新 更多