我是这个xml和dtd文件的新手。我需要你的帮助,如何创建我的模型,以便在其中上传一个xml文件。 我必须使用的文件可以在这两个链接下找到:
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...
相同指向需要外键,但姓氏,名字对于每个名称看起来都是唯一的,所以下一个类:
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模型语言重现它的规则。
告诉我您是否需要更多详细信息。
希望它有所帮助。