2017-09-17 59 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模型語言中重現它的規則。

如果您需要更多詳情,告訴我。

希望它有幫助。