2012-02-29 12 views
1

入力ファイルは実際には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 
+0

私はこのxpathを試しました '/ applicants/applicant/*/*/text()| // Beyer-Daniel Lee-Franklin-TN-US-US-Friedland-Jasonマイケル - フランクリン-TN-US-省略 - 米国。これはあなたの望む出力ですか? – RanRag

+0

少なくとも私の出力が見えるように、はい、いいえ。出力をまとめて接続しましたか?私の出力は '| Roskam-Cameron O.- -Grand Rapids- -MI- -US- -mitted-US |'とリターンとこれらの余分なハイフンで構成されていました。それは無意味な文字列に収まるようにする方法はありますか? –

+0

はあなたの出力をまとめましたか? – RanRag

答えて

0

この質問はthis other question of yoursと非常によく似ています。

二つの問題がここにあります

  1. はどのように「非標準XML」を「標準XML」から取得するには?
  2. 子孫要素のテキスト値を取得して連結するにはXPathをどのように使用するのですか?

攻撃する前に1を解決する必要があります。2.それに助けが必要な場合は、別の質問をしてください。

「非標準XML」はと全く同じXMLではありません。です。 XMLとして解析することはできず、XPathを使用することはできません。しかし、とにかくそれをやろうとしているように見えるように、あなたはその質問を表現しました。

あなたの質問は実際には「標準XML」で作業していると仮定すると、my answer to your other questionと同じアプローチを使用するとどうなりますか?

+1

標準xmlのアプローチには問題ありません。それは動作しますが、私の質問は、非標準のXMLとそれを解析する方法についてです。ここで引用されているように(http://stackoverflow.com/questions/7335560/python-to-parse-non-standard-xml-file/7336718#7336718)、非標準のxmlを解析して同じものでxpathを使うことができますPythonのプロセス。私は、この例で提供されているこのPythonを使って、子どもの情報を解析しますが、孫は解析しません。私が求めていた質問は、xpathを使って孫のテキストを読んで、順番に情報に結合して文字列を引き出す方法でした。 –

+0

また、データソースはGoogle Patentsの上に直接引用されています。非標準のxmlファイルで、1つの単数ファイルに複数のxmlファイルが追加されています。一見これを見たとき、私は他人がそれが解析される必要があることを知っているように思っていましたが、このファイルの編集には2つの問題があります。その非常に大きい(430MB)と2つの各XMLには、ファイル編集プログラム内で選択できないユニークなナンバーコード(ファイルあたり約5000個)を含む ' 'に固有のXMLスタイルのコードがありますメモ帳++など。 Pythonがそれを解析するだけで、1000以上のファイルを手動で編集する必要はありません –

+0

他の人があなたを助けてくれるようにする必要があります。 「非標準XML」データファイルを解析可能なXMLに変換できない場合は、**についてのみ新しい質問**をお願いします。問題の要点を示すトリムダウンされた[SSCCE](http://sscce.org/)を構築します。 – mzjn

関連する問題