入力ファイルは実際には1つのファイルに追加される複数のXMLファイルです。 (ソース:Google Patents)。これは一例です:非標準xml用のPythonでの適切なxpath構文
<?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 combinationsを試しましたが、<applicants>
のハイフンで文字列を生成することはできません。//text()は孫に到達できませんストリングスを助けてください。子孫と孫の中のすべてのテキストを<applicant>
として選択するには、適切なxpath構文は何ですか?それでも文字列で打ち抜きますか?この例では表示されていませんが、テキスト行の先頭にも存在する可能性のあるUnicodeを無視する方法があります(後のxmlドキュメントの一部に表示されると思います)。私のようなものになります得ることを望んだ「申請者出力:
Beyer-Daniel Lee-Franklin-TN-US-omitted-US-Friedland-Jason Michael-Franklin-TN-US-omitted-US
私はこのxpathを試しました '/ applicants/applicant/*/*/text()| // Beyer-Daniel Lee-Franklin-TN-US-US-Friedland-Jasonマイケル - フランクリン-TN-US-省略 - 米国。これはあなたの望む出力ですか? – RanRag
少なくとも私の出力が見えるように、はい、いいえ。出力をまとめて接続しましたか?私の出力は '| Roskam-Cameron O.- -Grand Rapids- -MI- -US- -mitted-US |'とリターンとこれらの余分なハイフンで構成されていました。それは無意味な文字列に収まるようにする方法はありますか? –
はあなたの出力をまとめましたか? – RanRag