首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用lxml重写

使用lxml重写
EN

Stack Overflow用户
提问于 2017-07-13 14:35:14
回答 1查看 165关注 0票数 0

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

生成的架构包括一个基本架构,我使用目录将包含URI更改为本地文件。我在Python中设置了环境变量'XML_CATALOG_FILES‘,这非常有用。

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

这是目录。

代码语言:javascript
复制
<?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进行验证时,这个目录文件在氧气中确实工作得很好。

XML文件中的示例引用如下所示:

代码语言:javascript
复制
xsi:schemaLocation="https://www.s3model.com/ns/s3m/ https://dmgen.s3model.com/dmlib/dm-a42592f1-e8b3-4862-b6e2-ac0e48c138f4.xsd">

知道为什么lxml (Libxml2)会识别这个rewriteSystem吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-17 12:52:43

而不是在数据文件中创建解析器和引用架构。

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

代码语言:javascript
复制
    schema_doc = etree.parse(schema)
    modelSchema = etree.XMLSchema(schema_doc)

变量模式保存XML架构的字符串表示形式。

然后,在创建每个数据文档时,使用以下方法使用该模式对其进行验证:

代码语言:javascript
复制
  try:
     tree = etree.parse(StringIO(xmlStr))
     modelSchema.assertValid(tree)
  except etree.DocumentInvalid:
     file_id = "Invalid_" + file_id

我不得不删除XML声明:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>

以使etree.parse也能正确工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45083809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档