Maison >développement back-end >Tutoriel Python >Impossible de valider XML à l'aide du schéma, mais fonctionne en lisant le fichier écrit à partir de

Impossible de valider XML à l'aide du schéma, mais fonctionne en lisant le fichier écrit à partir de

WBOY
WBOYavant
2024-02-22 12:34:02713parcourir

无法使用架构验证 XML,但可以通过从中读取写入的文件来工作

Contenu de la question

J'utilise actuellement lxml et je souhaite valider le contenu XML.

J'ai commencé avec tei = etree.element("tei", nsmap={none: 'http://www.tei-c.org/ns/1.0'} écrit entièrement en python et contient de nombreux sous-éléments. p>

Maintenant, je veux vérifier si la structure est correcte à l'aide d'un .xsd fichier spécifique en utilisant le code suivant :

xmlschema_doc = etree.parse(xsd_file_path)
xmlschema = etree.xmlschema(xmlschema_doc)
# run check
status = xmlschema.validate(xml_tree)

Il renvoie false et affiche l'erreur element 'tei':没有可用于验证 root. pour la déclaration globale correspondante

J'ai observé une chose très étrange, si j'écris du XML en utilisant

et = etree.elementtree(xmldata)
et.write('test.xml', pretty_print=true, xml_declaration=true, encoding='utf-8')

Si j'utilise le résultat de

, la structure XML est valideb= etree.parse('test.xml') 重新打开它,我最终没有错误,并且由于 xmlschema.validate(b)

Une idée de ce que je dois ajouter dans la structure XML ?

Éditeur : Premier élément invalide en XML

Le premier élément d'un fichier XML valide

Éditeur :

<?xml version='1.0' encoding='UTF-8'?>
<TEI xmlns="http://www.tei-c.org/ns/1.0">
  <text>
    <body>
      <listBibl>
        <biblFull>
          <titleStmt>
            <title xml:lang="en">article</title>
            <title xml:lang="fr">article</title>
            <title type="sub" xml:lang="en">A subtitle</title>
            <author role="aut">
              <persName>
                <forename type="first">John</forename>
                <surname>Doe</surname>
              </persName>
              <email>email</email>
              <idno type="http://orcid.org/">orcid</idno>
              <affiliation ref="#localStruct-affiliation"/>
              <affiliation ref="#struct-affiliation"/>
            </author>
            <author role="aut">
              <persName>
                <forename type="first">Jane</forename>
                <forename type="middle">Middle</forename>
                <surname>Doe</surname>
              </persName>
              <email>email</email>
              <idno type="http://orcid.org/">orcid</idno>
              <affiliation ref="#localStruct-affiliationA"/>
              <affiliation ref="#localStruct-affiliationB"/>
            </author>
          </titleStmt>
          <editionStmt>
            <edition>
              <ref type="file" subtype="author" n="1" target="upload.pdf"/>
            </edition>
          </editionStmt>
          <publicationStmt>
            <availability>
              <licence target="https://creativecommons.org/licenses//cc-by/"/>
            </availability>
          </publicationStmt>
          <notesStmt>
            <note type="audience" n="2"/>
            <note type="invited" n="1"/>
            <note type="popular" n="0"/>
            <note type="peer" n="1"/>
            <note type="proceedings" n="0"/>
            <note type="commentary">small comment</note>
            <note type="description">small description</note>
          </notesStmt>
          <sourceDesc>
            <biblStruct>
              <analytic>
                <title xml:lang="en">article</title>
                <title xml:lang="fr">article</title>
                <title type="sub" xml:lang="en">A subtitle</title>
                <author role="aut">
                  <persName>
                    <forename type="first">John</forename>
                    <surname>Doe</surname>
                  </persName>
                  <email>email</email>
                  <idno type="http://orcid.org/">orcid</idno>
                  <affiliation ref="#localStruct-affiliation"/>
                  <affiliation ref="#struct-affiliation"/>
                </author>
                <author role="aut">
                  <persName>
                    <forename type="first">Jane</forename>
                    <forename type="middle">Middle</forename>
                    <surname>Doe</surname>
                  </persName>
                  <email>email</email>
                  <idno type="http://orcid.org/">orcid</idno>
                  <affiliation ref="#localStruct-affiliationA"/>
                  <affiliation ref="#localStruct-affiliationB"/>
                </author>
              </analytic>
              <monogr>
                <idno type="isbn">978-1725183483</idno>
                <idno type="halJournalId">117751</idno>
                <idno type="issn">xxx</idno>
                <imprint>
                  <publisher>springer</publisher>
                  <biblScope unit="serie">a special collection</biblScope>
                  <biblScope unit="volume">20</biblScope>
                  <biblScope unit="issue">1</biblScope>
                  <biblScope unit="pp">10-25</biblScope>
                  <date type="datePub">2024-01-01</date>
                </imprint>
              </monogr>
              <series/>
              <idno type="doi">reg</idno>
              <idno type="arxiv">ger</idno>
              <idno type="bibcode">erg</idno>
              <idno type="ird">greger</idno>
              <idno type="pubmed">greger</idno>
              <idno type="ads">gaergezg</idno>
              <idno type="pubmedcentral">gegzefdv</idno>
              <idno type="irstea">vvxc</idno>
              <idno type="sciencespo">gderg</idno>
              <idno type="oatao">gev</idno>
              <idno type="ensam">xcvcxv</idno>
              <idno type="prodinra">vxcv</idno>
              <ref type="publisher">https://publisher.com/ID</ref>
              <ref type="seeAlso">https://link1.com/ID</ref>
              <ref type="seeAlso">https://link2.com/ID</ref>
              <ref type="seeAlso">https://link3.com/ID</ref>
            </biblStruct>
          </sourceDesc>
          <profileDesc>
            <textClass>
              <keywords scheme="author">
                <term xml:lang="en">keyword1</term>
                <term xml:lang="en">keyword2</term>
                <term xml:lang="fr">mot-clé1</term>
                <term xml:lang="fr">mot-clé2</term>
              </keywords>
              <classCode scheme="halDomain" n="physics"/>
              <classCode scheme="halDomain" n="halDomain2"/>
              <classCode scheme="halTypology" n="ART"/>
            </textClass>
          </profileDesc>
        </biblFull>
      </listBibl>
    </body>
    <back>
      <listOrg type="structures">
        <org type="institution" xml:id="localStruct-affiliation">
          <orgName>laboratory for MC, university of Yeah</orgName>
          <orgName type="acronym">LMC</orgName>
          <desc>
            <address>
              <addrLine>Blue street 155, 552501 Olso, Norway</addrLine>
              <country key="LS">Lesotho</country>
            </address>
            <ref type="url" target="https://lmc.univ-yeah.com"/>
          </desc>
        </org>
        <org type="institution" xml:id="localStruct-affiliationB">
          <orgName>laboratory for MCL, university of Yeah</orgName>
          <orgName type="acronym">LMCL</orgName>
          <desc>
            <address>
              <addrLine>Blue street 155, 552501 Olso, Norway</addrLine>
              <country key="NO">Norway</country>
            </address>
            <ref type="url" target="https://lmcl.univ-yeah.com"/>
          </desc>
        </org>
      </listOrg>
    </back>
  </text>
</TEI>


Bonne réponse


Regardez

https://www.php.cn/link/e1ff36b97044a1c7c73c73e4d27aeba4, vous devriez essentiellement utiliser

tei_namespace = "http://www.tei-c.org/ns/1.0"
tei = "{%s}" % tei_namespace

nsmap = {none : tei_namespace} # the default namespace (no prefix)

root = etree.element(tei + "tei", nsmap=nsmap) # lxml only!
text = etree.subelement(root, tei + "text")

Et ainsi de suite pour tous les éléments afin de garantir qu'ils sont créés dans l'espace de noms tei.

L'arbre d'éléments créé en mémoire valide pour le schéma (après l'avoir téléchargé avec le fichier xml.xsd w3c importé) est par exemple

from lxml import etree

TEI_NAMESPACE = "http://www.tei-c.org/ns/1.0"
TEI = "{%s}" % TEI_NAMESPACE

NSMAP = {None : TEI_NAMESPACE} # the default namespace (no prefix)

root = etree.Element(TEI + "TEI", nsmap=NSMAP) # lxml only!
text = etree.SubElement(root, TEI + "text")
body = etree.SubElement(text, TEI + "body")
listBibl = etree.SubElement(body, TEI + "listBibl")
biblFull = etree.SubElement(listBibl, TEI + "biblFull")
sourceDesc = etree.SubElement(biblFull, TEI + "sourceDesc")
profileDesc = etree.SubElement(biblFull, TEI + "profileDesc")


xmlschema_doc = etree.parse("aofr.xsd")
xmlschema = etree.XMLSchema(xmlschema_doc)
# run check
status = xmlschema.validate(root)

print(status)

print(xmlschema.error_log)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer