我尝试扩展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>
有什么想法吗?感谢
答案 0 :(得分: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
的实体应该无法验证包含ext:crawl
的XML,因为sitemap.xsd
使用了processContents="strict"
{1}}表示元素通配符。
我还没有尝试过,但您可以通过xsi:schemaLocation提供您的扩展程序XSD的网址(我会惊讶地看到google的验证程序遵循外部架构位置提示)。
如果您打算将修改后的XSD与JAXB一起使用,并希望现在在您的类定义中看到一个用于抓取的字段,您可能会感到意外(我上次检查时,通过限制重新定义至少没有&t; t工作)。
您仍然可以使用ext:crawl取消/编组XML,您只需使用XmlNode手动执行此操作。