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

在Python中使用lxml将XSD解析为XML时包含以下xs:include,python,xml,xsd,Python,Xml,Xsd,所以,我的问题是我试图做一些有点不正统的事情。我有一组复杂的XSD文件。但是,我不想使用这些XSD文件来验证XML文件;我想将这些XSD解析为XML,并像查询普通XML文件一样对它们进行查询。这是可能的,因为XSD是有效的XML。我正在使用lxml和Python3 我遇到的问题是声明: <xs:include schemaLocation="sdm-extension.xsd"/> 将解析此依赖关系(该文件与我刚才加载的文件位于同一目录中)。但是,我将它们视为XML,因此,正确地说

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

我遇到的问题是声明:

<xs:include schemaLocation="sdm-extension.xsd"/>
将解析此依赖关系(该文件与我刚才加载的文件位于同一目录中)。但是,我将它们视为XML,因此,正确地说,lxml只是将其视为具有属性的普通元素,而不是跟随它

是否有一种简单或正确的方法来扩展lxml,以便我可以拥有与(比如)相同或类似的行为

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


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

因此,似乎有一个选择是使用xi:xinclude方法,创建一个单独的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中的自定义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)

实际上,当涉及到名称空间时,这种方法存在一个问题。一个XSD可以通过名称空间引用另一个XSD文件中的内容。所以仅仅使用xinclude本身是不行的。
 def combine(xsd_file):
      with open(xsd_file, 'rb') as f_xsd:
          parser = etree.XMLParser(recover=True, encoding='utf-8',remove_comments=True,                    remove_blank_text=True)

          xsd_source = f_xsd.read()
          root = etree.fromstring(xsd_source, parser)
          incl = etree.XInclude()
          incl(root)

          print(etree.tostring(root, pretty_print=True))
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)