Python 从API调用返回的XML分配变量

Python 从API调用返回的XML分配变量,python,xml,django,api,activecollab,Python,Xml,Django,Api,Activecollab,我需要从API中提取一些数据。它返回GET in XML,我在试图找出如何将API中的一些数据分配给django/python模型中的字段时遇到了一些问题 activeCollab的API不允许我创建自己的projectID编号,它会自动为我生成编号。因此,我希望获取该编号,然后将其分配到项目模型中的API_id字段。有人能帮我弄清楚如何获取GET返回的XML并将其分配给我的一个字段吗 项目的ActiveCollab API文档: 这是我的模特 class Project(models.Mod

我需要从API中提取一些数据。它返回GET in XML,我在试图找出如何将API中的一些数据分配给django/python模型中的字段时遇到了一些问题

activeCollab的API不允许我创建自己的projectID编号,它会自动为我生成编号。因此,我希望获取该编号,然后将其分配到项目模型中的API_id字段。有人能帮我弄清楚如何获取GET返回的XML并将其分配给我的一个字段吗

项目的ActiveCollab API文档:

这是我的模特

class Project(models.Model):
client = models.ForeignKey(Clients, related_name='projects')
created_by = models.ForeignKey(User, related_name='created_by')


#general information
API_id = models.IntegerField(max_length=10, verbose_name='aC ProjectID', null=True, blank=True)
proj_name = models.CharField(max_length=255, verbose_name='Project Name')
pre_quote = models.CharField(max_length=3)
quote = models.IntegerField(max_length=10, verbose_name='Quote #', unique=True)
estimator = models.ForeignKey(User, related_name='Estimator', null=True)
desc = models.TextField(verbose_name='Description', null=True, blank=True)
starts_on = models.DateField(verbose_name='Start Date')
due_date = models.DateField(verbose_name='Due Date', null=True, blank=True)
completed_on = models.DateField(verbose_name='Finished On', null=True, blank=True)
notes = models.TextField(verbose_name='Notes', null=True, blank=True)
Views.py

def addProject(request):
if request.method == 'POST':
    form = AddSingleProjectForm(request.POST)
    if form.is_valid():
        project = form.save(commit=False)
        project.created_by = request.user 
        today = datetime.date.today()
        project.pre_quote = "%s-" % (str(today.year)[2:4])
        project.quote = Project.objects.latest().quote+1
        project.save()

        project.status.create(
                value = form.cleaned_data.get('status', None)
        )            

        #API activeCollab
        params = urllib.urlencode({
              'format':'xml',
              'submitted':'submitted',
              'project[name]': project.proj_name,
              'project[overview]': project.desc,
              'project[starts_on]': project.starts_on,
              'project[leader_id]': 10,
        })
        req = urllib2.Request("web_url/public/api.php?path_info=/projects/add&token=####################", params)
        f = urllib2.urlopen(req)
        print f.read()


        return HttpResponseRedirect('/project/')
else:
    form = AddSingleProjectForm()

return render_to_response('project/addProject.html', {
'form': form, 'user':request.user}, context_instance=RequestContext(request))
如有任何建议,将不胜感激

史蒂夫


我展示的api调用是在查看了您发布的链接后创建一个新项目。。。使用
lxml
xpath
,您可能会开始这样做:

>>> from lxml import etree
>>> doc = etree.XML("""<projects>
...   <project>
...     <id>1</id>
...     <name>
...       <![CDATA[First Project]]>
...     </name>
...     <overview>
...       <![CDATA[<p>This is overview of the first project</p>]]>
...     </overview>
...     <status>
...       <![CDATA[active]]>
...     </status>
...     <type>...</type>
...     <permalink>...</permalink>
...     <leader_id>...</leader_id>
...     <company_id>...</company_id>
...     <group_id>...</group_id>
...   </project>
... </projects>""")
>>> data = {}
>>> for a in doc.xpath('/projects/project/*'):
...   data[a.tag] = str(a.text).strip()
...
>>> data
{'company_id': '...',
 'group_id': '...',
 'id': '1',
 'leader_id': '...',
 'name': 'First Project',
 'overview': '<p>This is overview of the first project</p>',
 'permalink': '...',
 'status': 'active',
 'type': '...'}

看过你发布的链接后。。。使用
lxml
xpath
,您可能会开始这样做:

>>> from lxml import etree
>>> doc = etree.XML("""<projects>
...   <project>
...     <id>1</id>
...     <name>
...       <![CDATA[First Project]]>
...     </name>
...     <overview>
...       <![CDATA[<p>This is overview of the first project</p>]]>
...     </overview>
...     <status>
...       <![CDATA[active]]>
...     </status>
...     <type>...</type>
...     <permalink>...</permalink>
...     <leader_id>...</leader_id>
...     <company_id>...</company_id>
...     <group_id>...</group_id>
...   </project>
... </projects>""")
>>> data = {}
>>> for a in doc.xpath('/projects/project/*'):
...   data[a.tag] = str(a.text).strip()
...
>>> data
{'company_id': '...',
 'group_id': '...',
 'id': '1',
 'leader_id': '...',
 'name': 'First Project',
 'overview': '<p>This is overview of the first project</p>',
 'permalink': '...',
 'status': 'active',
 'type': '...'}

你到底有什么问题?您似乎对提交请求并返回XML感到非常高兴。你在哪一点上遇到了麻烦?那部分正在工作,但问题是项目ID不同。activeCollab中的ID与django项目中的ID不同。因此,我不知道如何进行编辑呼叫或删除呼叫,因为ID不相同。您到底有什么问题?您似乎对提交请求并返回XML感到非常高兴。你在哪一点上遇到了麻烦?那部分正在工作,但问题是项目ID不同。activeCollab中的ID与django项目中的ID不同。因此,我不知道如何进行编辑调用或删除调用,因为ID不相同。嘿,MattH,我在安装lxml时遇到了一些问题,你能在这个问题上提供任何帮助吗?它告诉我模块不存在?我试图安装模块,但我认为我做得不对。可能最好开始一个关于模块安装的新问题。好的,在我开始另一个问题之前,我将做更多的研究嘿,MattH,我在安装lxml时遇到一些问题,你能在这个问题上提供任何帮助吗?它告诉我模块不存在?我试图安装模块,但我认为我做得不对。可能最好开始一个关于模块安装的新问题。好的,在我开始另一个问题之前,我将做更多的研究