0

我正在生成一个 XML 模式,然后在 Python3 中生成数据文件。

生成的架构包含一个基本架构,我使用目录将包含 URI 更改为本地文件。我在 Python 中设置了环境变量“XML_CATALOG_FILES”,效果很好。

但是,我尝试使用rewriteSystem来使用本地生成的模式来代替数据文件中的通用位置引用,并且 rewrite 似乎不起作用。

这是目录。

<?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>

当在 Oxygen 中使用 Xerces 或 Saxon 进行验证时,此目录文件可以正常工作。

XML 文件中的示例参考如下所示:

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

任何想法为什么 lxml (Libxml2) 确实识别这个 rewriteSystem?

4

1 回答 1

0

而不是创建解析器并引用数据文件中的模式。

我通过从 lxml 中的模式字符串创建模式对象来使用不同的方法。

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

变量schema保存 XML 模式的字符串表示。

然后在创建每个数据文档时,使用该模式验证它:

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

我不得不删除 XML 声明:

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

让 etree.parse 也能正常工作。

于 2017-07-17T12:52:43.367 回答