Si utilizamos Java en nuestro proyecto, podemos utilizar la biblioteca SitemapGen4j, la cual nos permite generar un sitemap en formato XML de forma automática. Esta biblioteca nos genera uno o varios ficheros con nuestro mapa del sitio. Otra alternativa es generar la salida XML de forma dinámica sin tener que escribir en fichero, en mi caso elegí esta segunda opción, ya que se adaptaba mejor a mi proyecto. Si os decidís por la primer opción os dejo este enlace con un tutorial que explica bien como utilizar esta biblioteca.
Para no depender de esta biblioteca vamos a ver como podemos crear nuestro sitemap.xml utilizando nuestras propias clases. Como he dicho anteriormente, este fichero va a contener un conjunto de URLs con algunos datos acerca de cada una. Para modelar este fichero vamos a utilizar dos clases: XmlURL que será cada una de nuestras Urls y XmlUrlSet que será el conjunto de Urls. Aquí podéis encontrar más información acerca de la solución planteada.
XmlUrl.java
En esta clase definimos los atributos de una URL. En loc estableceremos la ruta de la URL, también establecemos la fecha de última modificación en la propiedad lastmod, la frecuencia changefreq y la prioridad priority.
@XmlAccessorType(value = XmlAccessType.NONE)
@XmlRootElement(name = "url")
public class XmlUrl {
public enum Priority {
HIGH("1.0"), MEDIUM("0.5");
private String value;
Priority(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
@XmlElement
private String loc;
@XmlElement
private String lastmod = new DateTime().toString(DateTimeFormat.forPattern("yyyy-MM-dd"));
@XmlElement
private String changefreq = "daily";
@XmlElement
private String priority;
public XmlUrl() {
}
public XmlUrl(String loc, Priority priority) {
this.loc = loc;
this.priority = priority.getValue();
}
public String getLoc() {
return loc;
}
public String getPriority() {
return priority;
}
public String getChangefreq() {
return changefreq;
}
public String getLastmod() {
return lastmod;
}
}
XmlUrlSet.javaEsta clase nos sirve como colección de Urls. En ella definimos un método para añadir Urls de tipo XmlUrl.
@XmlAccessorType(value = XmlAccessType.NONE)
@XmlRootElement(name = "urlset", namespace = "http://www.sitemaps.org/schemas/sitemap/0.9")
public class XmlUrlSet {
@XmlElements({@XmlElement(name = "url", type = XmlUrl.class)})
private Collection<XmlUrl> xmlUrls = new ArrayList<XmlUrl>();
public void addUrl(XmlUrl xmlUrl) {
xmlUrls.add(xmlUrl);
}
public Collection<XmlUrl> getXmlUrls() {
return xmlUrls;
}
}
Y ya solo nos queda crear un controlador que ofrezca como salida la petición a la dirección "/sitemap.xml". En esta clase tenemos un método create con el que añadiremos cada Url y un método principal main donde especificamos las Urls de nuestro sitio. Aquí podemos por ejemplo, hacer una consulta a la base de datos para obtener todos los posts de nuestra web y añadirlos como entradas.@Controller
public class SitemapController {
@RequestMapping(value = "/sitemap.xml", method = RequestMethod.GET)
@ResponseBody
public XmlUrlSet main() {
XmlUrlSet xmlUrlSet = new XmlUrlSet();
create(xmlUrlSet, "", XmlUrl.Priority.HIGH);
create(xmlUrlSet, "/link-1", XmlUrl.Priority.HIGH);
create(xmlUrlSet, "/link-2", XmlUrl.Priority.MEDIUM);
// aquí podemos crear un bucle con información de nuestra base de datos.
...
return xmlUrlSet;
}
private void create(XmlUrlSet xmlUrlSet, String link, XmlUrl.Priority priority) {
xmlUrlSet.addUrl(new XmlUrl("http://www.mysite.com" + link, priority));
}
}
Con este código ya tenemos todo lo necesario para crear un fichero básico sitemap.xml en nuestro sitio web. Espero que os haya sido de ayuda.