Возникли проблемы с составлением XSD файла Sitemap для изображений в соответствии со спецификациями Google - PullRequest
0 голосов
/ 09 июля 2020

В настоящее время у меня есть конфигурация карты сайта для нашего веб-сайта, однако я пытаюсь добавить изображения в соответствии со спецификацией карты сайта Google.

Вот как это выглядит сегодня:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url>
        <loc>https://www.example.com/</loc>
    </url>
    <url>
        <loc>https://www.example.com/category/something</loc>
    </url>
    <url>
        <loc>https://www.example.com/category/something2</loc>
    </url>
</urlset>

И как это должно выглядеть:

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
        xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">
  <url>
    <loc>http://example.com/</loc>
    <image:image>
      <image:loc>http://example.com/image.jpg</image:loc>
    </image:image>
    <image:image>
      <image:loc>http://example.com/photo.jpg</image:loc>
    </image:image>
  </url> 
</urlset> 

Согласно документации Google (https://www.google.com/schemas/sitemap-image/1.1/) мне нужно использовать основную карту сайта для основных элементов (ту, которую я все еще использую) и используйте изображение для элементов изображения.

Это сложная часть для меня - это выглядит очень просто, но я не настолько квалифицирован для этого.

Мне удалось для этого в моем XSD-файле (я использую плагин jabx):

<xsd:schema
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
        xmlns:image="http://www.google.com/schemas/sitemap-image/1.1"
        targetNamespace="http://www.sitemaps.org/schemas/sitemap/0.9" elementFormDefault="qualified">

<xsd:import namespace="http://www.google.com/schemas/sitemap-image/1.1" schemaLocation="image.xsd"/>

<xsd:element name="urlset">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="url" type="tUrl" maxOccurs="unbounded"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>

    <xsd:complexType name="tUrl">
        <xsd:sequence>
            <xsd:element name="loc" type="tLoc"/>
            <xsd:element name="lastmod" type="tLastmod" minOccurs="0"/>
            <xsd:element name="changefreq" type="tChangeFreq" minOccurs="0"/>
            <xsd:element name="priority" type="tPriority" minOccurs="0"/>
            <xsd:element maxOccurs="unbounded" ref="image:image"/>
        </xsd:sequence>
    </xsd:complexType>

<!-- and goes on -->

Это заставляет его работать, но шифрует пространства имен - элементы изображения не имеют изображения пространства имен, а ядро элементы получают случайное пространство имен ns2 :

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:urlset xmlns="http://www.google.com/schemas/sitemap-image/1.1" 
            xmlns:ns2="http://www.sitemaps.org/schemas/sitemap/0.9">
    <ns2:url>
        <ns2:loc>https://www.example.com/</ns2:loc>
        <ns2:changefreq>daily</ns2:changefreq>
        <ns2:priority>0.7</ns2:priority>
    </ns2:url>
    <ns2:url>
        <ns2:loc>https://www.example.com/category/example1</ns2:loc>
        <ns2:changefreq>daily</ns2:changefreq>
        <ns2:priority>0.7</ns2:priority>
        <image>
            <loc>https://www.example.com/images/ẗest.jpg</loc>
            <caption>test</caption>
            <title>test</title>
        </image>
        <image>
            <loc>https://www.example.com/images/ẗest2.jpg</loc>
            <caption>test2</caption>
            <title>test2</title>
        </image>
    </ns2:url>
</ns2:urlset>

У меня заканчиваются идеи. Что я делаю не так?

1 Ответ

0 голосов
/ 10 июля 2020

Не уверен, есть ли другой способ сделать это, но я исправил префикс, создав сопоставитель пространства имен:

public class DefaultNamespacePrefixMapper extends NamespacePrefixMapper {

    private Map<String, String> namespaceMap = new HashMap<>();

    /**
     * Create mappings.
     */
    public DefaultNamespacePrefixMapper() {
        namespaceMap.put("http://www.sitemaps.org/schemas/sitemap/0.9", "");
        namespaceMap.put("http://www.google.com/schemas/sitemap-image/1.1", "image");
    }

    @Override
    public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) {
        return namespaceMap.getOrDefault(namespaceUri, suggestion);
    }
}

А при использовании маршаллера я просто установил:

Marshaller m = context.createMarshaller();
DefaultNamespacePrefixMapper mapper = new DefaultNamespacePrefixMapper();
m.setProperty("com.sun.xml.internal.bind.namespacePrefixMapper", mapper);

Мой XML выглядит правильно точно так же, как документация Google.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...