2

我尝试扩展sitemap.xsd:我想向 tUrl complexType 添加一个新元素(称为“crawl”)。

所以我创建了一个 sitemap-extended.xsd(我重新定义了 sitemap.xsd 并扩展了 tUrl)。:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema 
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.sitemaps.org/schemas/sitemap/0.9" 
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
elementFormDefault="qualified">

<xsd:redefine schemaLocation="sitemap.xsd">
    <xsd:complexType name="tUrl">
        <xsd:complexContent mixed="false">
            <xsd:extension base="tUrl">
                <xsd:sequence>
                    <xsd:element name="crawl" type="xsd:string" maxOccurs="1" />
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
</xsd:redefine>
</xsd:schema>

这是有效的,但生成的 XML 无效(例如,由于未知实体 - 抓取,googlebot 将无法验证此 XML)。所以我认为我应该使用不同的命名空间来实现这一点,但我没有找到任何解决方案。

我希望能够编组/解组这种 XML:

<?xml version='1.0' encoding='UTF-8'?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
 xmlns:ext="http://www.mycompany.com/schema/myns"
 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.mycompany.com/schema/myns http://www.mycompany.com/schema/myns/sitemap.xsd">
   <url>
     <loc>...</loc>
     <ext:crawl>...</ext:crawl>
      ...
   </url>
  </urlset>

任何的想法 ?谢谢

4

1 回答 1

1

这里有几个问题。

您修改后的 XSD 描述了无法通过sitemap.xsd验证的 XML,因为您从http://www.sitemaps.org/schemas/sitemap/0.9- 添加内容是不允许的。

在此处输入图像描述

正确的方法是移动crawl到另一个命名空间,然后引用它。

扩展 XSD:

<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xsd:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" xmlns="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="crawl" type="xsd:string"/>
</xsd:schema>

修改重新定义:

<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XSR Module (http://www.paschidev.com)-->
<xsd:schema xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:ext="http://tempuri.org/XMLSchema.xsd" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:redefine schemaLocation="../Standards/sitemap/sitemap.xsd">
    <xsd:complexType name="tUrl">
      <xsd:complexContent>
        <xsd:restriction base="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 ref="ext:crawl"/>
        </xsd:sequence>
        </xsd:restriction>
      </xsd:complexContent>
    </xsd:complexType>
  </xsd:redefine>
  <xsd:import namespace="http://tempuri.org/XMLSchema.xsd" schemaLocation="extending-or-redefining-xsd-complextype-ext.xsd"/>   
</xsd:schema>

现在,即使这在技术上是正确的,不加载 的实体也Extension XSD应该无法验证包含的 XML,ext:crawl因为它sitemap.xsd使用processContents="strict"了元素通配符。

我没有尝试过,但您可以通过 xsi:schemaLocation 提供您的扩展 XSD 的 URL(如果看到 google 的验证器遵循外部模式位置提示,我会感到惊讶)。

如果您计划将修改后的 XSD 与 JAXB 一起使用,并希望现在在您的类定义中看到一个用于爬网的字段,您可能会感到惊讶(上次我检查时,通过限制重新定义至少不起作用)。

您仍然可以使用 ext:crawl 取消/编组 XML,您只需使用 XmlNode 手动执行此操作。

于 2013-04-12T16:44:12.700 回答