Объединить несколько файлов XML с Groovy - PullRequest
0 голосов
/ 22 января 2019

Я довольно новичок в Groovy, и на самом деле только что узнал об этом вчера. Я создаю сайт с помощью статического генератора сайтов MkDocs , и новое внутреннее требование приводит к тому, что мне приходится разделять текущий сайт на три разных контейнера сайта, чтобы обеспечить уникальные поисковые индексы и так далее. Об этом все заботятся и строят с использованием Jenkins, и он отлично работает.

Это решение, к сожалению, приводит к трем разным картам сайтов, которые мне нужно объединить, и мне было предложено изучить Groovy. Я получил большую часть приведенного ниже кода из Groovy - объединяющего XML-узлы , и я не получил никакого другого результата, кроме первой карты сайта, записанной в моем файле. Любые предложения, что может быть не так?

//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
}

/ сайт-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>

/ сайт-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>

/ сайт-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>

1 Ответ

0 голосов
/ 22 января 2019

1. после переменной синтаксического анализа xml, уже ссылающейся на корневой элемент, поэтому для доступа к тегу urlset вам просто нужно использовать sm1... вместо sm1.urlset...

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...