不确定为什么我的 XML 文件会出现 invalid/no 语法,以及为什么我的模式也没有验证?
Not sure why my XML file is coming up as invalid/no grammar found and why my schema is not validating either?
我对XML有些陌生,但我一直无法找出这些错误。这是我第一次尝试创建 "advanced" 模式,但我不确定导入以及如何在模式中引用 "urlset"...这些是错误:
Ln 14 Col 7 - Document is invalid: no grammar found.
Ln 14 Col 7 - Document root element "sites", must match DOCTYPE root "null".
2 Errors
...
Ln 31 Col 98 - s4s-att-invalid-value: Invalid attribute value for 'ref' in element 'element'. Recorded reason: cvc-datatype-valid.1.2.1: 'http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd' is not a valid value for 'QName'.
1 Error
代码如下:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:cc="http://example.com/weekendfunsnacks/sites/ns"
xmlns:sm="http://www.sitemaps.org/schemas/sitemap/0.9"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:import namespace="http://www.sitemaps.org/schemas/sitemap/0.9"
schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" />
<xs:element name="sites">
<xs:complexType>
<xs:sequence>
<xs:element name="site" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="name"/>
<xs:element type="xs:byte" name="totalPages" />
<xs:element ref="http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
<sites xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:crs="http://example.com/weekendfunsnacks/sites/ns">
<site>
<name>Weekend Fun Snacks</name>
<totalPages>127</totalPages>
<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">
<url>
<loc>http://example.com/weekendfunsnacks/?cat=58</loc>
</url>
<url>
<loc>http://example.com/weekendfunsnacks/?cat=2</loc>
<lastmod>2017-12-29T06:03:34+00:00</lastmod>
</url>
<url>
<loc>http://example.com/weekendfunsnacks/?cat=15</loc>
<lastmod>2017-12-29T05:24:04+00:00</lastmod>
</url>
<url>
<loc>http://example.com/weekendfunsnacks/?cat=93</loc>
</url>
<url>
<loc>http://example.com/weekendfunsnacks/?cat=55</loc>
</url>
</urlset>
</site>
<site>
<name>Paleo Snacks</name>
<totalPages>52</totalPages>
<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">
<url>
<loc>http://example.com/primalsnacks/?cat=6</loc>
</url>
<url>
<loc>http://example.com/primalsnacks/?cat=18</loc>
<lastmod>2017-09-19T17:13:19+00:00</lastmod>
</url>
<url>
<loc>http://example.com/primalsnacks/?cat=54</loc>
<lastmod>2017-09-19T15:24:01+00:00</lastmod>
</url>
<url>
<loc>http://example.com/primalsnacks/?cat=52</loc>
<lastmod>2017-09-28T21:03:11+00:00</lastmod>
</url>
<url>
<loc>http://example.com/primalsnacks/?cat=201</loc>
<lastmod>2017-10-06T07:03:26+00:00</lastmod>
</url>
<url>
<loc>http://example.com/primalsnacks/?cat=11</loc>
</url>
</urlset>
</site>
<site>
<name>Veg Snacks</name>
<totalPages>17</totalPages>
<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">
<url>
<loc>http://example.com/vegsnacks/?cat=102</loc>
</url>
<url>
<loc>http://example.com/vegsnacks/?cat=23</loc>
</url>
<url>
<loc>http://example.com/vegsnacks/?cat=1</loc>
</url>
<url>
<loc>http://example.com/vegsnacks/?cat=55</loc>
<lastmod>2017-06-12T08:05:32+00:00</lastmod>
</url>
<url>
<loc>http://example.com/vegsnacks/?cat=201</loc>
</url>
<url>
<loc>http://example.com/vegsnacks/?cat=87</loc>
</url>
</urlset>
</site>
</sites>
任何帮助或启发将不胜感激,谢谢。
您需要在您的架构和 XML:
中执行一些固定
首先,在架构中:
您只需要 "call" 对您正在导入的站点地图架构中定义的 urlset 元素的引用:<xs:element ref="sm:urlset" />
而不是 <xs:element ref="http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" />
。
您在这里会注意到的一点是,您从 sitemap.xsd 导入的元素绑定到命名空间 http://www.sitemaps.org/schemas/sitemap/0.9/ns
因此您需要添加前缀 sm:
urlset元素.
您还需要通过将 targetNamespace="http://example.com/weekendfunsnacks/sites/ns"
添加到您的架构的根元素来为您自己的架构定义一个目标命名空间。
完全更正的架构将是:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:cc="http://example.com/weekendfunsnacks/sites/ns"
xmlns:sm="http://www.sitemaps.org/schemas/sitemap/0.9"
elementFormDefault="qualified" attributeFormDefault="unqualified"
targetNamespace="http://example.com/weekendfunsnacks/sites/ns">
<xs:import namespace="http://www.sitemaps.org/schemas/sitemap/0.9"
schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" />
<xs:element name="sites">
<xs:complexType>
<xs:sequence>
<xs:element name="site" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="name"/>
<xs:element type="xs:byte" name="totalPages" />
<xs:element ref="sm:urlset" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
然后 XML 实例:
既然已经在架构中进行了一些修复,您将需要从 XML 中适当地调用它。主要错误是您没有在 <sites>
元素上设置 schemaLocation
。这将解决此问题:
<sites xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://example.com/weekendfunsnacks/sites/ns funsnacks.xsd"
xmlns="http://example.com/weekendfunsnacks/sites/ns"
xmlns:sm="http://www.sitemaps.org/schemas/sitemap/0.9">
同时还请注意,我为 sitemap.xsd 模式添加了命名空间声明 (xmlns:sm
)。这引导我们进行下一个修复 - 您必须为 <urlset>
元素使用此命名空间前缀。下面提供了修复的示例。您也不再需要这些元素的 xsi
相关声明:
<sm:urlset>
<sm:url>
<sm:loc>http://example.com/vegsnacks/?cat=55</sm:loc>
<sm:lastmod>2017-06-12T08:05:32+00:00</sm:lastmod>
</sm:url>
<!-- and so on ... -->
</sm:urlset>
您完全更正的输入示例将变为:
<?xml version="1.0" encoding="UTF-8"?>
<sites xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://example.com/weekendfunsnacks/sites/ns funsnacks.xsd"
xmlns="http://example.com/weekendfunsnacks/sites/ns"
xmlns:sm="http://www.sitemaps.org/schemas/sitemap/0.9">
<site>
<name>Weekend Fun Snacks</name>
<totalPages>127</totalPages>
<sm:urlset>
<sm:url>
<sm:loc>http://example.com/weekendfunsnacks/?cat=58</sm:loc>
</sm:url>
<sm:url>
<sm:loc>http://example.com/weekendfunsnacks/?cat=2</sm:loc>
<sm:lastmod>2017-12-29T06:03:34+00:00</sm:lastmod>
</sm:url>
<sm:url>
<sm:loc>http://example.com/weekendfunsnacks/?cat=15</sm:loc>
<sm:lastmod>2017-12-29T05:24:04+00:00</sm:lastmod>
</sm:url>
<sm:url>
<sm:loc>http://example.com/weekendfunsnacks/?cat=93</sm:loc>
</sm:url>
<sm:url>
<sm:loc>http://example.com/weekendfunsnacks/?cat=55</sm:loc>
</sm:url>
</sm:urlset>
</site>
<site>
<name>Paleo Snacks</name>
<totalPages>52</totalPages>
<sm:urlset>
<sm:url>
<sm:loc>http://example.com/primalsnacks/?cat=6</sm:loc>
</sm:url>
<sm:url>
<sm:loc>http://example.com/primalsnacks/?cat=18</sm:loc>
<sm:lastmod>2017-09-19T17:13:19+00:00</sm:lastmod>
</sm:url>
<sm:url>
<sm:loc>http://example.com/primalsnacks/?cat=54</sm:loc>
<sm:lastmod>2017-09-19T15:24:01+00:00</sm:lastmod>
</sm:url>
<sm:url>
<sm:loc>http://example.com/primalsnacks/?cat=52</sm:loc>
<sm:lastmod>2017-09-28T21:03:11+00:00</sm:lastmod>
</sm:url>
<sm:url>
<sm:loc>http://example.com/primalsnacks/?cat=201</sm:loc>
<sm:lastmod>2017-10-06T07:03:26+00:00</sm:lastmod>
</sm:url>
<sm:url>
<sm:loc>http://example.com/primalsnacks/?cat=11</sm:loc>
</sm:url>
</sm:urlset>
</site>
<site>
<name>Veg Snacks</name>
<totalPages>17</totalPages>
<sm:urlset>
<sm:url>
<sm:loc>http://example.com/vegsnacks/?cat=102</sm:loc>
</sm:url>
<sm:url>
<sm:loc>http://example.com/vegsnacks/?cat=23</sm:loc>
</sm:url>
<sm:url>
<sm:loc>http://example.com/vegsnacks/?cat=1</sm:loc>
</sm:url>
<sm:url>
<sm:loc>http://example.com/vegsnacks/?cat=55</sm:loc>
<sm:lastmod>2017-06-12T08:05:32+00:00</sm:lastmod>
</sm:url>
<sm:url>
<sm:loc>http://example.com/vegsnacks/?cat=201</sm:loc>
</sm:url>
<sm:url>
<sm:loc>http://example.com/vegsnacks/?cat=87</sm:loc>
</sm:url>
</sm:urlset>
</site>
</sites>
另一种可能性是根据需要更改 <urlset>
上的默认命名空间(尽管我认为使用前缀更清楚,这样您就可以明确地知道您正在使用的命名空间),如下所示:
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>http://example.com/weekendfunsnacks/?cat=2</loc>
<lastmod>2017-12-29T06:03:34+00:00</lastmod>
</url>
<!-- and so on -->
</urlset>
我对XML有些陌生,但我一直无法找出这些错误。这是我第一次尝试创建 "advanced" 模式,但我不确定导入以及如何在模式中引用 "urlset"...这些是错误:
Ln 14 Col 7 - Document is invalid: no grammar found.
Ln 14 Col 7 - Document root element "sites", must match DOCTYPE root "null". 2 Errors
...
Ln 31 Col 98 - s4s-att-invalid-value: Invalid attribute value for 'ref' in element 'element'. Recorded reason: cvc-datatype-valid.1.2.1: 'http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd' is not a valid value for 'QName'. 1 Error
代码如下:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:cc="http://example.com/weekendfunsnacks/sites/ns"
xmlns:sm="http://www.sitemaps.org/schemas/sitemap/0.9"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:import namespace="http://www.sitemaps.org/schemas/sitemap/0.9"
schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" />
<xs:element name="sites">
<xs:complexType>
<xs:sequence>
<xs:element name="site" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="name"/>
<xs:element type="xs:byte" name="totalPages" />
<xs:element ref="http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
<sites xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:crs="http://example.com/weekendfunsnacks/sites/ns">
<site>
<name>Weekend Fun Snacks</name>
<totalPages>127</totalPages>
<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">
<url>
<loc>http://example.com/weekendfunsnacks/?cat=58</loc>
</url>
<url>
<loc>http://example.com/weekendfunsnacks/?cat=2</loc>
<lastmod>2017-12-29T06:03:34+00:00</lastmod>
</url>
<url>
<loc>http://example.com/weekendfunsnacks/?cat=15</loc>
<lastmod>2017-12-29T05:24:04+00:00</lastmod>
</url>
<url>
<loc>http://example.com/weekendfunsnacks/?cat=93</loc>
</url>
<url>
<loc>http://example.com/weekendfunsnacks/?cat=55</loc>
</url>
</urlset>
</site>
<site>
<name>Paleo Snacks</name>
<totalPages>52</totalPages>
<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">
<url>
<loc>http://example.com/primalsnacks/?cat=6</loc>
</url>
<url>
<loc>http://example.com/primalsnacks/?cat=18</loc>
<lastmod>2017-09-19T17:13:19+00:00</lastmod>
</url>
<url>
<loc>http://example.com/primalsnacks/?cat=54</loc>
<lastmod>2017-09-19T15:24:01+00:00</lastmod>
</url>
<url>
<loc>http://example.com/primalsnacks/?cat=52</loc>
<lastmod>2017-09-28T21:03:11+00:00</lastmod>
</url>
<url>
<loc>http://example.com/primalsnacks/?cat=201</loc>
<lastmod>2017-10-06T07:03:26+00:00</lastmod>
</url>
<url>
<loc>http://example.com/primalsnacks/?cat=11</loc>
</url>
</urlset>
</site>
<site>
<name>Veg Snacks</name>
<totalPages>17</totalPages>
<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">
<url>
<loc>http://example.com/vegsnacks/?cat=102</loc>
</url>
<url>
<loc>http://example.com/vegsnacks/?cat=23</loc>
</url>
<url>
<loc>http://example.com/vegsnacks/?cat=1</loc>
</url>
<url>
<loc>http://example.com/vegsnacks/?cat=55</loc>
<lastmod>2017-06-12T08:05:32+00:00</lastmod>
</url>
<url>
<loc>http://example.com/vegsnacks/?cat=201</loc>
</url>
<url>
<loc>http://example.com/vegsnacks/?cat=87</loc>
</url>
</urlset>
</site>
</sites>
任何帮助或启发将不胜感激,谢谢。
您需要在您的架构和 XML:
中执行一些固定首先,在架构中:
您只需要 "call" 对您正在导入的站点地图架构中定义的 urlset 元素的引用:<xs:element ref="sm:urlset" />
而不是 <xs:element ref="http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" />
。
您在这里会注意到的一点是,您从 sitemap.xsd 导入的元素绑定到命名空间 http://www.sitemaps.org/schemas/sitemap/0.9/ns
因此您需要添加前缀 sm:
urlset元素.
您还需要通过将 targetNamespace="http://example.com/weekendfunsnacks/sites/ns"
添加到您的架构的根元素来为您自己的架构定义一个目标命名空间。
完全更正的架构将是:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:cc="http://example.com/weekendfunsnacks/sites/ns"
xmlns:sm="http://www.sitemaps.org/schemas/sitemap/0.9"
elementFormDefault="qualified" attributeFormDefault="unqualified"
targetNamespace="http://example.com/weekendfunsnacks/sites/ns">
<xs:import namespace="http://www.sitemaps.org/schemas/sitemap/0.9"
schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" />
<xs:element name="sites">
<xs:complexType>
<xs:sequence>
<xs:element name="site" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="name"/>
<xs:element type="xs:byte" name="totalPages" />
<xs:element ref="sm:urlset" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
然后 XML 实例:
既然已经在架构中进行了一些修复,您将需要从 XML 中适当地调用它。主要错误是您没有在 <sites>
元素上设置 schemaLocation
。这将解决此问题:
<sites xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://example.com/weekendfunsnacks/sites/ns funsnacks.xsd"
xmlns="http://example.com/weekendfunsnacks/sites/ns"
xmlns:sm="http://www.sitemaps.org/schemas/sitemap/0.9">
同时还请注意,我为 sitemap.xsd 模式添加了命名空间声明 (xmlns:sm
)。这引导我们进行下一个修复 - 您必须为 <urlset>
元素使用此命名空间前缀。下面提供了修复的示例。您也不再需要这些元素的 xsi
相关声明:
<sm:urlset>
<sm:url>
<sm:loc>http://example.com/vegsnacks/?cat=55</sm:loc>
<sm:lastmod>2017-06-12T08:05:32+00:00</sm:lastmod>
</sm:url>
<!-- and so on ... -->
</sm:urlset>
您完全更正的输入示例将变为:
<?xml version="1.0" encoding="UTF-8"?>
<sites xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://example.com/weekendfunsnacks/sites/ns funsnacks.xsd"
xmlns="http://example.com/weekendfunsnacks/sites/ns"
xmlns:sm="http://www.sitemaps.org/schemas/sitemap/0.9">
<site>
<name>Weekend Fun Snacks</name>
<totalPages>127</totalPages>
<sm:urlset>
<sm:url>
<sm:loc>http://example.com/weekendfunsnacks/?cat=58</sm:loc>
</sm:url>
<sm:url>
<sm:loc>http://example.com/weekendfunsnacks/?cat=2</sm:loc>
<sm:lastmod>2017-12-29T06:03:34+00:00</sm:lastmod>
</sm:url>
<sm:url>
<sm:loc>http://example.com/weekendfunsnacks/?cat=15</sm:loc>
<sm:lastmod>2017-12-29T05:24:04+00:00</sm:lastmod>
</sm:url>
<sm:url>
<sm:loc>http://example.com/weekendfunsnacks/?cat=93</sm:loc>
</sm:url>
<sm:url>
<sm:loc>http://example.com/weekendfunsnacks/?cat=55</sm:loc>
</sm:url>
</sm:urlset>
</site>
<site>
<name>Paleo Snacks</name>
<totalPages>52</totalPages>
<sm:urlset>
<sm:url>
<sm:loc>http://example.com/primalsnacks/?cat=6</sm:loc>
</sm:url>
<sm:url>
<sm:loc>http://example.com/primalsnacks/?cat=18</sm:loc>
<sm:lastmod>2017-09-19T17:13:19+00:00</sm:lastmod>
</sm:url>
<sm:url>
<sm:loc>http://example.com/primalsnacks/?cat=54</sm:loc>
<sm:lastmod>2017-09-19T15:24:01+00:00</sm:lastmod>
</sm:url>
<sm:url>
<sm:loc>http://example.com/primalsnacks/?cat=52</sm:loc>
<sm:lastmod>2017-09-28T21:03:11+00:00</sm:lastmod>
</sm:url>
<sm:url>
<sm:loc>http://example.com/primalsnacks/?cat=201</sm:loc>
<sm:lastmod>2017-10-06T07:03:26+00:00</sm:lastmod>
</sm:url>
<sm:url>
<sm:loc>http://example.com/primalsnacks/?cat=11</sm:loc>
</sm:url>
</sm:urlset>
</site>
<site>
<name>Veg Snacks</name>
<totalPages>17</totalPages>
<sm:urlset>
<sm:url>
<sm:loc>http://example.com/vegsnacks/?cat=102</sm:loc>
</sm:url>
<sm:url>
<sm:loc>http://example.com/vegsnacks/?cat=23</sm:loc>
</sm:url>
<sm:url>
<sm:loc>http://example.com/vegsnacks/?cat=1</sm:loc>
</sm:url>
<sm:url>
<sm:loc>http://example.com/vegsnacks/?cat=55</sm:loc>
<sm:lastmod>2017-06-12T08:05:32+00:00</sm:lastmod>
</sm:url>
<sm:url>
<sm:loc>http://example.com/vegsnacks/?cat=201</sm:loc>
</sm:url>
<sm:url>
<sm:loc>http://example.com/vegsnacks/?cat=87</sm:loc>
</sm:url>
</sm:urlset>
</site>
</sites>
另一种可能性是根据需要更改 <urlset>
上的默认命名空间(尽管我认为使用前缀更清楚,这样您就可以明确地知道您正在使用的命名空间),如下所示:
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>http://example.com/weekendfunsnacks/?cat=2</loc>
<lastmod>2017-12-29T06:03:34+00:00</lastmod>
</url>
<!-- and so on -->
</urlset>