0

我正在尝试通过 lxml 和 xsd (ogckml22.xsd) 验证一些 XML。这是离线发生的。我通过直接打开/读取读取文件

作为记录,http://www.opengis.net/kml/2.2 无效。

来自另一篇文章:(由于评论请求而澄清..)

from lxml import etree
import os
import sys
import StringIO
file=open('ogckml22.xsd')
data=file.read()
str=StringIO.StringIO(data)
try:
     xmlschema_doc=etree.parse(data)
except IOError as ex:
    print "oops {0}".format(ex.strerror)
except:
    print "Unexpected error:", sys.exc_info()[0]

xmlschema=etree.XMLSchema(xmlschema_doc)  

我得到的只是“连接被拒绝”。使用 try/except,我得到未定义 xmlschema_doc。

File "<stdin>", line 1, in <module>  
File "<xmlschema.pxi",line 105, in lxml.etree.XMLSchema.__init__ (src/lxml/lxml.etree.c:132748  
   self.error_log)  
lxml.etree.XMLSchemaParseError: connection refused  

我知道它可以读取上面的 xsd 文件和包含的另一个 xsd 文件。

好吧,也许 xsd 被读取了?我下载了 lxml 和 src/lxml/xmlschema.pxi 的源代码,

if self._c_schema is NULL:
    raise XMLSchemaParseError(
        self.error_log._buildExceptionMessage(
            u"Document is not valid XML Schema"),
        self._error_log)

我从来没有看到“文档不是有效的 XML 架构”消息。我只能假设使用“拒绝连接”代替“文档消息”(默认值?),但更彻底地阅读 _error_log (在重新编译之外)逃避了我....

真挚地,

箭树

4

1 回答 1

1

ogckml22.xsd导入另外两个模式文档(atom-author-link.xsd 和 xAL.xsd):

<!-- import atom:author and atom:link -->
<import namespace="http://www.w3.org/2005/Atom" 
        schemaLocation="atom-author-link.xsd"/>

<!-- import xAL:Address -->
<import namespace="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0" 
        schemaLocation="http://docs.oasis-open.org/election/external/xAL.xsd"/>

如果要离线解析模式,则需要使这两个文档在本地可用,并且给出的路径schemaLocation必须正确。

可以简化模式的解析和加载(不需要StringIO):

from lxml import etree

xmlschema_doc = etree.parse("ogckml22.xsd") 
xmlschema = etree.XMLSchema(xmlschema_doc)

print xmlschema

输出:

<lxml.etree.XMLSchema object at 0x00D25120>

我不明白您所说的“为了记录,http://www.opengis.net/kml/2.2无效”是什么意思。

如果您可以访问 Internet,则可以使用 URL 作为参数etree.parse()

xmlschema_doc = etree.parse("http://www.opengis.net/kml/2.2")

至少这对我有用。

于 2012-11-08T18:27:58.810 回答