使用python为非标准xml提供适当的xpath语法



输入文件实际上是多个XML文件附加到一个文件中。(来源于谷歌专利)。这是一个例子:

<?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" [ ]>

我正试图在带有lxml的python中使用以下内容为<applicant>中的所有子代和孙代创建一个具有"-".join-xpath的字符串:

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")

我尝试过多个xpath组合,但我无法为<applicants>生成带连字符的字符串,虽然//text()无法到达孙子,但它对串接没有帮助。什么是合适的xpath语法来选择<applicant>的子代和子代中的所有文本,并且仍然在字符串中打孔?虽然本例中没有显示,但是否有一种方法可以忽略可能出现在文本行开头的unicode(我相信它会出现在后面的一些xml文档中)?我希望得到的"申请人"输出应该是这样的:

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

这个问题与您的另一个问题非常相似。

这里有两个问题:

  1. 如何从"非标准XML"走向"标准XML"
  2. 如何使用XPath获取子代元素的文本值并连接它们

在攻击2之前,你需要先解决1。如果你需要帮助,可以单独问一个问题。

"非标准XML"与相同,根本不是XML。你不能将它解析为XML,也不能在上面使用XPath。但你对这个问题的措辞让它看起来像是在尝试这样做。

假设您的问题实际上是关于使用"标准XML",那么使用与我在回答另一个问题时相同的方法如何?

最新更新