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(再コンパイル以外)をより完全に読むと回避できます....

心から、

ArrowInTree

4

1 に答える 1

1

ogckml22.xsdは、他の 2 つのスキーマ ドキュメント (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は有効ではありません」という意味がわかりません。

インターネットにアクセスできる場合は、URL を次の引数として使用できますetree.parse()

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

少なくともこれは私にとってはうまくいきます。

于 2012-11-08T18:27:58.810 に答える