扩展或重新定义XSD complexType

时间:2013-04-12 13:09:52

标签: xml xsd marshalling jaxb2 unmarshalling

我尝试扩展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>

有什么想法吗?感谢

1 个答案:

答案 0 :(得分:1)

这里有几个问题。

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

enter image description here

正确的方法是将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的实体应该无法验证包含ext:crawl的XML,因为sitemap.xsd使用了processContents="strict" {1}}表示元素通配符。

我还没有尝试过,但您可以通过xsi:schemaLocation提供您的扩展程序XSD的网址(我会惊讶地看到google的验证程序遵循外部架构位置提示)。

如果您打算将修改后的XSD与JAXB一起使用,并希望现在在您的类定义中看到一个用于抓取的字段,您可能会感到意外(我上次检查时,通过限制重新定义至少没有&t; t工作)。

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