2017-07-13 14 views
0

私はXMLスキーマを生成し、Python3でデータファイルを生成しています。lxmlで書き直しを使用する

生成されたスキーマには基本スキーマが含まれており、カタログを使用してインクルードURIをローカルファイルに変更します。私はPythonで環境変数 'XML_CATALOG_FILES'を設定しました。

はしかし、私が動作するようには思えないデータファイルで、一般的な位置基準の代わりに、局所的に生成されたスキーマを使用して書き換えるためにrewriteSystemを使用するようにしてください。

ここにカタログがあります。

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE catalog PUBLIC "-//OASIS//DTD XML Catalogs V1.1//EN" "http://www.oasis-open.org/committees/entity/release/1.1/catalog.dtd"> 
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog"> 

    <!-- S3Model 3.0.0 RM Schema --> 
    <uri name="https://www.s3model.com/ns/s3m/s3model_3_0_0.xsd" uri="s3model/s3model_3_0_0.xsd"/> 


    <!-- S3Model DMs --> 
    <rewriteSystem systemIdStartString="https://dmgen.s3model.com/dmlib/" rewritePrefix="file:///home/tim/DII/Kunteksto/output/"/> 
</catalog> 

このカタログファイルは、XercesまたはSaxonのいずれかを使用して検証するOxygenで正常に動作します。

XMLファイルの例参照は次のようになります。

xsi:schemaLocation="https://www.s3model.com/ns/s3m/ https://dmgen.s3model.com/dmlib/dm-a42592f1-e8b3-4862-b6e2-ac0e48c138f4.xsd"> 

任意のアイデアを理由lxmlの(Libxml2は)は、このrewriteSystemを認識していますか?

+0

あなたは「lxml(Libxml2)がこの書き換えを認識しない理由は何ですか?」という意味ですか? – mzjn

+0

あなたはPython 3について言及していますが、質問にはPythonコードはありません。これをどのように再現できますか? – mzjn

+0

質問は特にPythonに関するものではありません。カタログからのリライトを使用しないlxml経由のLibxml2についてです。ですから、lxml経由で(rewriteSystemを使って)XMLカタログを使用しようとすると再現できますが、もちろんPython経由です。 –

答えて

0

パーサーを作成し、データファイルでスキーマを参照する代わりに、

私は、lxmlのスキーマ文字列からスキーマオブジェクトを作成することによって、別の方法を使用しました。

schema_doc = etree.parse(schema) 
    modelSchema = etree.XMLSchema(schema_doc) 

変数スキーマは、XMLスキーマの文字列表現を保持しています。 etree.parseあまりにも正常に動作を取得するために

<?xml version="1.0" encoding="UTF-8"?> 

:私はXML宣言を削除する必要がありました

try: 
    tree = etree.parse(StringIO(xmlStr)) 
    modelSchema.assertValid(tree) 
    except etree.DocumentInvalid: 
    file_id = "Invalid_" + file_id 

を:各データの文書が作成されるよう

は、次に、それを使用してそのスキーマを使用して検証されます。

+0

この回答は 'rewriteSystem'カタログエントリの問題をどのように説明していますか? – mzjn

+0

rewriteSystemの問題には答えません。これは、lxmlの別のアプローチを使用することで回避されます。 –

関連する問題