如何基于DTD文件/ XML创建Django模型

时间:2017-09-17 13:26:46

标签: xml django dtd

我是这个xml和dtd文件的新手。我需要你的帮助,如何创建我的模型,以便在其中上传一个xml文件。 我必须使用的文件可以在这两个链接下找到:

XML fomat: https://webgate.ec.europa.eu/europeaid/fsd/fsf/public/files/dtdFullSanctionsList/content?token=dG9rZW4tMjAxNw

DTD格式: https://webgate.ec.europa.eu/europeaid/fsd/fsf/public/files/dtdFullSanctionsListSchema/content?token=dG9rZW4tMjAxNw

DTD文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT WHOLE (ENTITY+)>
<!ATTLIST WHOLE
    Date CDATA #REQUIRED
>
<!ELEMENT ENTITY (NAME+, ADDRESS*, BIRTH*, PASSPORT*, CITIZEN*)>
<!ATTLIST ENTITY
    Id CDATA #REQUIRED
    Type (E | P) #REQUIRED
    legal_basis CDATA #IMPLIED
    reg_date CDATA #IMPLIED
    pdf_link CDATA #IMPLIED
    programme CDATA #IMPLIED
    remark CDATA #IMPLIED
>
<!ELEMENT NAME (LASTNAME?, FIRSTNAME?, MIDDLENAME?, WHOLENAME?, GENDER?, TITLE?, FUNCTION?, LANGUAGE?)>
<!ATTLIST NAME
    Id CDATA #REQUIRED
    Entity_id CDATA #REQUIRED
    legal_basis CDATA #IMPLIED
    reg_date CDATA #IMPLIED
    pdf_link CDATA #IMPLIED
    programme CDATA #IMPLIED
>
<!ELEMENT LASTNAME (#PCDATA)>
<!ELEMENT FIRSTNAME (#PCDATA)>
<!ELEMENT MIDDLENAME (#PCDATA)>
<!ELEMENT WHOLENAME (#PCDATA)>
<!ELEMENT GENDER (#PCDATA)>
<!ELEMENT TITLE (#PCDATA)>
<!ELEMENT FUNCTION (#PCDATA)>
<!ELEMENT LANGUAGE (#PCDATA)>
<!ELEMENT ADDRESS (NUMBER?, STREET?, ZIPCODE?, CITY?, COUNTRY?, OTHER?)>
<!ATTLIST ADDRESS
    Id CDATA #REQUIRED
    Entity_id CDATA #REQUIRED
    legal_basis CDATA #IMPLIED
    reg_date CDATA #IMPLIED
    pdf_link CDATA #IMPLIED
    programme CDATA #IMPLIED
>
<!ELEMENT NUMBER (#PCDATA)>
<!ELEMENT STREET (#PCDATA)>
<!ELEMENT ZIPCODE (#PCDATA)>
<!ELEMENT CITY (#PCDATA)>
<!ELEMENT COUNTRY (#PCDATA)>
<!ELEMENT OTHER (#PCDATA)>
<!ELEMENT BIRTH (DATE?, PLACE?, COUNTRY?)>
<!ATTLIST BIRTH
    Id CDATA #REQUIRED
    Entity_id CDATA #REQUIRED
    legal_basis CDATA #IMPLIED
    reg_date CDATA #IMPLIED
    pdf_link CDATA #IMPLIED
    programme CDATA #IMPLIED
>
<!ELEMENT DATE (#PCDATA)>
<!ELEMENT PLACE (#PCDATA)>
<!ELEMENT PASSPORT (NUMBER?, COUNTRY?)>
<!ATTLIST PASSPORT
    Id CDATA #REQUIRED
    Entity_id CDATA #REQUIRED
    legal_basis CDATA #IMPLIED
    reg_date CDATA #IMPLIED
    pdf_link CDATA #IMPLIED
    programme CDATA #IMPLIED
>
<!ELEMENT CITIZEN (COUNTRY?)>
<!ATTLIST CITIZEN
    Id CDATA #REQUIRED
    Entity_id CDATA #REQUIRED
    legal_basis CDATA #IMPLIED
    reg_date CDATA #IMPLIED
    pdf_link CDATA #IMPLIED
    programme CDATA #IMPLIED
>

因此,如果有人可以帮助我创建模型以便使用DTD上传此xml文件,我会欠你很多!

谢谢!

1 个答案:

答案 0 :(得分:1)

所以我不知道从XML创建模型的任何自动方式。你可能需要手工完成。总的来说:

  • 您需要创建模型(models.py),这实际上取决于您对数据的理解方式。根据您发送的XML,它应该如下所示:

    class Entity(models.Model):
       id = models.IntegerField()
       type = models.CharField(max_length = 1)
       legal_basis = models.CharField(max_length = 100)
       etc...
    

相同指向需要外键,但姓氏,名字对于每个名称看起来都是唯一的,所以下一个类:

class Name(models.Model):
   id = models.IntegerField()
   entity_id = models.ForeignKey('Entity')
   legal_basis = models.CharField(max_length = 100)
   etc...
   first_name = models.CharField(max_length = 100)
   whole_name = models.CharField(max_length = 100)
   etc...

出生和护照也需要具有实体外键的类。请注意,通过正确选择max_length并确定id的唯一性等,可以大大改善这些类。

  • 接下来,您需要一个打开xml的脚本,并在您刚刚创建的模型上进行写入。它可以位于您的django应用程序的根目录(而不是项目)。这应该像这样开始(使用elementTree library):

    import os
    import sys
    import django 
    
    #this loads django so you can deal with models
    sys.path.append("/path/to/project/")
    os.environ["DJANGO_SETTINGS_MODULE"] = "your_project.settings"
    django.setup() 
    
    #import your models.py
    from yourapp.models import *
    
    #import XML parser and your file
    import xml.etree.ElementTree as ET
    tree = ET.parse('your_file.xml')
    root = tree.getroot()
    
  • 接下来你需要一些手工制作。遍历您的XML(位于您的根变量中)并使用elementtree API来获取内容。然后使用Django ORM写入您的模型。

这只是忽略了DTD文件。你基本上需要用django模型语言重现它的规则。

告诉我您是否需要更多详细信息。

希望它有所帮助。