2012-02-29 3 views
1

입력 파일은 실제로 하나의 파일에 추가되는 여러 XML 파일입니다. (출처 : Google Patents).비표준 XML을위한 python과 함께 적절한 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") 
다음 LXML와 Python으로 다음을 사용하여 <applicant>에서 나는 아이들과 손자 모두를위한 "-".join 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" [ ]> 

:이 예입니다

나는 복수 xpath combinations을 시도했지만, <applicants>에 하이픈이 포함 된 문자열을 생성 할 수없고, //text()는 손주에게 가지 않습니다. 끈에 도움. 자식과 손자녀 내의 모든 텍스트를 <applicant>으로 선택하기위한 적절한 xpath 구문은 무엇이며 여전히 문자열로 펀치 아웃합니까? 이 예제에서는 표시되지 않지만 텍스트 줄의 시작 부분에 나타날 수도있는 유니 코드를 무시하는 방법이 있습니다 (일부 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-omitted-US-Friedland-Jason Michael-Franklin-TN-US-omitted-// 신청자/지원자/주소록/주소/*/text() 미국. 이것이 원하는 결과물입니까? – 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로 사용할 수 없습니다. 그러나 당신은 어쨌든 그것을하려고하는 것처럼 보이게 만드는 방식으로 질문을 표현했습니다.

"표준 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를 사용할 수있다. 파이썬 프로세스. 이 예제에서 제공된이 비단뱀을 사용하여 어린이의 정보를 파싱했지만 손자는 파싱하지 않았습니다. 내가 묻는 질문은 xpath를 사용하여 손주의 텍스트를 읽는 방법과 정보에 순서대로 연결하는 것입니다. –

+0

또한 데이터 소스는 Google 특허권에서 직접 인용 한 것입니다. 하나의 단일 파일 내에 추가 된 많은 xml 파일로 구성된 비표준 XML 파일입니다. 언뜻보기에 이것을 보았을 때 나는 다른 사람들처럼 파싱하도록 조정해야한다는 것을 알고 있었지만이 파일을 편집 할 때 두 가지 문제가있었습니다. 그것의 매우 큰 (430 MB)와 두 개의 xml은 파일 편집 프로그램에서 선택할 수없는 고유 번호 코드 (파일 당 약 5000 개)를 포함하는'에 대한 고유 한 XML 스타일 코드를 가지고 있습니다 메모장 + +와 같은. 파이썬이 단지 그것을 파싱 할 수있을 때 수동으로 1000 개 이상의 파일을 편집하는 것은 필요하지 않습니다. –

+0

다른 사람들이 당신을 도울 수 있도록 만들어야합니다. "비표준 XML"데이터 파일을 구문 분석 가능한 XML로 변환하는 데 문제가있는 경우 **에 대해서만 새 질문 **을 요청하십시오. 문제의 요점을 보여주는 트리밍 된 [SSCCE] (http://sscce.org/)를 구성하십시오. – mzjn

관련 문제