Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用lxml对多个xsd模式进行验证?_Python_Xml_Xsd_Lxml - Fatal编程技术网

Python 如何使用lxml对多个xsd模式进行验证?

Python 如何使用lxml对多个xsd模式进行验证?,python,xml,xsd,lxml,Python,Xml,Xsd,Lxml,我正在编写一个单元测试,通过获取其xsd模式并使用python的lxml库进行验证来验证我生成的站点地图xml: 下面是有关我的根元素的一些元数据: xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0

我正在编写一个单元测试,通过获取其xsd模式并使用python的lxml库进行验证来验证我生成的站点地图xml:

下面是有关我的根元素的一些元数据:

xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:image="http://www.google.com/schemas/sitemap-image/1.1"
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"
这个测试代码是:

_xsd_validators = {}
def get_xsd_validator(url):
    if url not in _xsd_validators:
        _xsd_validators[url] = etree.XMLSchema(etree.parse(StringIO(requests.get(url).content)))
    return _xsd_validators[url]


# this util function is later on in a TestCase
def validate_xml(self, content):
    content.seek(0)
    doc = etree.parse(content)
    schema_loc = doc.getroot().attrib.get('{http://www.w3.org/2001/XMLSchema-instance}schemaLocation').split(' ')
    # lxml doesn't like multiple namespaces
    for i, loc in enumerate(schema_loc):
        if i % 2 == 1:
            get_xsd_validator(schema_loc[i]).assertValid(doc)
    return doc
验证失败的XML示例:

<?xml version="1.0" encoding="UTF-8"?>
<urlset
  xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
  xmlns:image="http://www.google.com/schemas/sitemap-image/1.1"
  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"
>
  <url>
    <loc>https://www.example.com/press</loc>
    <lastmod>2016-08-11</lastmod>

    <changefreq>weekly</changefreq>
  </url>

  <url>
    <loc>https://www.example.com/about-faq</loc>
    <lastmod>2016-08-11</lastmod>

    <changefreq>weekly</changefreq>
  </url>


</urlset>
或:


您可以尝试定义一个wrapper schema wrapper-schema.xsd来导入所需的所有模式,并将此模式与lxml一起使用,而不是与其他模式一起使用

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:import
    namespace="http://www.sitemaps.org/schemas/sitemap/0.9"
    schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"/>
  <xs:import
    namespace="http://www.google.com/schemas/sitemap-image/1.1"
    schemaLocation="http://www.google.com/schemas/sitemap-image/1.1/sitemap-image.xsd"/>
</xs:schema>

我没有python,但这在氧气中成功验证:

<?xml version="1.0" encoding="UTF-8"?>
<urlset  xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
    xmlns:image="http://www.google.com/schemas/sitemap-image/1.1"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="wrapper-schema.xsd"
    >
    <image:image>
        <image:loc>http://www.example.com/image</image:loc>
    </image:image>
    <url>
        <loc>https://www.example.com/press</loc>
        <lastmod>2016-08-11</lastmod>
        <changefreq>weekly</changefreq>
    </url>
    <url>
        <loc>https://www.example.com/about-faq</loc>
        <lastmod>2016-08-11</lastmod>
        <changefreq>weekly</changefreq>
    </url>
</urlset>

http://www.example.com/image
https://www.example.com/press
2016-08-11
每周的
https://www.example.com/about-faq
2016-08-11
每周的

谢谢,我来试试。看起来不错!以下是此解决方案的帮助步骤:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:import
    namespace="http://www.sitemaps.org/schemas/sitemap/0.9"
    schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"/>
  <xs:import
    namespace="http://www.google.com/schemas/sitemap-image/1.1"
    schemaLocation="http://www.google.com/schemas/sitemap-image/1.1/sitemap-image.xsd"/>
</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<urlset  xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
    xmlns:image="http://www.google.com/schemas/sitemap-image/1.1"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="wrapper-schema.xsd"
    >
    <image:image>
        <image:loc>http://www.example.com/image</image:loc>
    </image:image>
    <url>
        <loc>https://www.example.com/press</loc>
        <lastmod>2016-08-11</lastmod>
        <changefreq>weekly</changefreq>
    </url>
    <url>
        <loc>https://www.example.com/about-faq</loc>
        <lastmod>2016-08-11</lastmod>
        <changefreq>weekly</changefreq>
    </url>
</urlset>