以下xs:include在Python中用lxml将XSD解析为XML

2024-06-09 15:31:37 发布

您现在位置:Python中文网/ 问答频道 /正文

所以,我的问题是我想做一些不正统的事情。我有一组复杂的XSD文件。但是,我不想使用这些XSD文件来验证XML文件;我希望将这些XSD解析为XML并像普通XML文件一样对它们进行询问。这是可能的,因为xsd是有效的XML。我在用lxml和Python3。在

我遇到的问题是:

<xs:include schemaLocation="sdm-extension.xsd"/>

如果我指示lxml创建一个XSD来进行如下验证:

^{pr2}$

这个依赖关系将被解决(文件与我刚刚加载的文件在同一个目录中)。但是,我将它们视为XML,因此,正确地说,lxml只是将其视为具有属性的普通元素,而不跟随它。在

有没有一个简单或正确的方法来扩展lxml,以便我可以有相同或类似的行为,比如说

<xi:include href="metadata.xml" parse="xml" xpointer="title"/>

当然,我可以手动创建一个单独的xml文件,其中包含XSD模式中的所有依赖项。这也许是一个解决办法?在


Tags: 文件includeextensionxml事情lxmlpython3xsd
2条回答

这样看来,一种选择是使用席:XCube方法,并创建一个单独的XML文件,其中包括所有要解析的XSD。大致如下:

<fullxsd>
<xi:include href="./xsd-cdisc-sdm-1.0.0/sdm1-0-0.xsd" parse="xml"/>
<xi:include href="./xsd-cdisc-sdm-1.0.0/sdm-ns-structure.xsd" parse="xml"/>
</fullxsd>

然后使用一些lxml

^{pr2}$

这并不理想,但似乎是正确的方法。我看过lxml中的自定义URI解析器,但这意味着实际上要修改xsd,这看起来更混乱。在

试试这个:

def validate_xml(schema_file, xml_file):
    xsd_doc = etree.parse(schema_file)
    xsd = etree.XMLSchema(xsd_doc)
    xml = etree.parse(xml_file)
    return xsd.validate(xml)

相关问题 更多 >