适用于非标准xml的xthon的xpath语法

时间:2012-02-29 23:30:27

标签: python xml xpath

输入文件实际上是附加到一个文件的多个XML文件。 (来自Google Patents)。这是一个例子:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE us-patent-grant SYSTEM "us-patent-grant-v42-2006-08-23.dtd" [ ]>
<us-patent-grant lang="EN" dtd-version="v4.2 2006-08-23">
<applicants>
<applicant sequence="001" app-type="applicant-inventor" designation="us-only">
<addressbook><last-name>Beyer</last-name>
<first-name>Daniel Lee</first-name>
<address><city>Franklin</city>
<state>TN</state>
<country>US</country></address></addressbook>
<nationality><country>omitted</country></nationality>
<residence><country>US</country></residence>
</applicant>
<applicant sequence="002" app-type="applicant-inventor" designation="us-only">
<addressbook><last-name>Friedland</last-name>
<first-name>Jason Michael</first-name>
<address><city>Franklin</city>
<state>TN</state>
<country>US</country></address></addressbook>
<nationality><country>omitted</country></nationality>
<residence><country>US</country></residence>
</applicant>
</applicants>
</us-patent-grant>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE us-patent-grant SYSTEM "us-patent-grant-v42-2006-08-23.dtd" [ ]>

我正在尝试使用以下命令为"-".join中的所有子孙创建一个<applicant> xpath的字符串,使用以下命令在python中使用lxml:

import urllib2, os, zipfile
from lxml import etree
count = 0
for item in xmlSplitter(zf.open(xml_file)):
  count += 1
  if count > 1: break
  doc = etree.XML(item)
  docID = "-".join(doc.xpath('//publication-reference/document-id/*/text()'))
  title = first(doc.xpath('//invention-title/text()'))
  applicant = "-".join(doc.xpath('//applicants/applicant/*/text()'))
  print "DocID:    {0}\nTitle:    {1}\nApplicant: {2}\n".format(docID,title,applicant)
  outFile.write(str(docID) +"|"+ str(title) +"|"+ str(applicant) +"\n")

我已经尝试过mutliple xpath combinations但是我无法为<applicants>生成带连字符的字符串,而 / / text()无法获得它的孙子穿线来帮忙。什么是适当的xpath语法来选择<applicant>的子孙中的所有文本并仍然在字符串中打出来?虽然在这个例子中没有显示有没有办法忽略可能出现在文本行开头的unicode(我相信它出现在一些后来的xml文档中)?我希望获得的“申请人”输出应该类似于:

Beyer-Daniel Lee-Franklin-TN-US-omitted-US-Friedland-Jason Michael-Franklin-TN-US-omitted-US

1 个答案:

答案 0 :(得分:0)

此问题与this other question of yours非常相似。

这里有两个问题:

  1. 如何从“非标准XML”到“标准XML”?
  2. 如何使用XPath获取后代元素的文本值并将它们连接起来?
  3. 你需要在攻击之前解决1 2.如果你需要帮助,请提出一个单独的问题。

    “非标准XML”与完全不是XML 相同。您无法将其解析为XML,也无法在其上使用XPath。但是你已经用一种方式表达了这个问题,无论如何你看起来都是这么做的。

    假设您的问题实际上是关于使用“标准XML”,那么如何使用与my answer to your other question中相同的方法?