Проверьте XML по двум XSD для карты сайта Google Images - PullRequest
0 голосов
/ 19 апреля 2011

У меня есть XML-файл (карта сайта с использованием расширений Google <image:image>), который мне нужно проверить по двум локальным XSD-файлам, но проверка не удалась, поскольку <url> не допускает <image:image> в качестве дочернего элемента.Полное сообщение об ошибке:

org.xml.sax.SAXParseException: 
cvc-complex-type.2.4.a: Invalid content was found starting with element 'image:image'.
One of '{"http://www.sitemaps.org/schemas/sitemap/0.9":lastmod, 
         "http://www.sitemaps.org/schemas/sitemap/0.9":changefreq, 
         "http://www.sitemaps.org/schemas/sitemap/0.9":priority}' 
is expected.

Вот карта XML, которую я пытаюсь проверить:

<?xml version="1.0"?>
<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/index.html</loc>
    <image:image>
      <image:loc>http://example.com/images/mysite.jpg</image:loc>
      <image:title>My Site's Logo</image:title>
      <image:caption>Logo for My Site by Andy Warhol (not really)</image:caption>
    </image:image>
  </url>
  ...
</urlset>

Я использую стандартные XSD для sitemaps и Google Images , но поскольку ни одна из них не ссылается на другую, я не вижу, как сделать <image:image> действительным потомком <url>.

Если это поможет, вот код, который выполняетпроверка.

Source document = ...
StreamSource[] source = new StreamSource[] {
        new StreamSource(this.getClass().getResourceAsStream("sitemap.xsd"), "http://www.sitemaps.org/schemas/sitemap/0.9"),
        new StreamSource(this.getClass().getResourceAsStream("sitemap-image.xsd"), "http://www.google.com/schemas/sitemap-image/1.1")
    };
SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI).newSchema(source)
             .newValidator().validate(document);

Ближайший вопрос SO, который я смог найти , требует предварительного разбора и разделения файла XML, поскольку применяемая схема варьируется в зависимости от значений данных.Мое требование намного проще, и я надеюсь, что его будет гораздо проще решить.

Обновление: У меня была старая схема, которая не позволяла другим дочерним элементам для элемента.sitemaps.org обновил свой XSD, добавив

<xsd:any namespace="##other" minOccurs="0" maxOccurs="unbounded" processContents="strict"/>

Ответы [ 2 ]

1 голос
/ 11 октября 2011

Мне потребовалось время, чтобы выяснить синтаксис для проверки схемы (собственные образцы Google фактически не проверяют файлы XSD):

<urlset  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation=
        "http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd
        http://www.google.com/schemas/sitemap-image/1.1 http://www.google.com/schemas/sitemap-image/1.1/sitemap-image.xsd"
         xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
         xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">
1 голос
/ 19 апреля 2011

На самом деле схема Sitemap допускает любой элемент в этом месте, если он находится в другом пространстве имен, и при условии, что существует схема (так как "processContent" строгий. Однако ваши данные недопустимы

должно появиться до .

Когда я тестирую его на Java 1.6, он подтверждает ОК.

...