2017-09-17 63 views
0

我是这个xml和dtd文件的新手。我需要你的帮助来创建我的模型,以便上传一个xml文件。 的文件,我有可以在这两个链接找到的工作:如何基于DTD文件/ XML创建Django模型

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文件,我会欠你很多!

谢谢!

+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... 
    

Identation指出,需要一个外键的,但姓氏,名字独特的外观为每名,所以下课时:

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,并在你的IDS assgning独特性等

  • 接下来你需要打开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模型语言中重现它的规则。

如果您需要更多详情,告诉我。

希望它有帮助。