Подходящий синтаксис xpath с python для нестандартного xml - PullRequest
1 голос
/ 01 марта 2012

Входной файл - это фактически несколько файлов 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 xpath для всех детей и внуков в <applicant>, используя в 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 , но я не могу создать строку с дефисами для <applicants>, и хотя / / text () не могу добраться до внука, это не поможет с натягиванием. Каков соответствующий синтаксис xpath, чтобы выделить весь текст в дочерних элементах и ​​внуках <applicant> и все же выделить его в строку? Хотя это и не показано в этом примере, есть ли способ игнорировать юникод, который может присутствовать и в начале текстовой строки (я полагаю, он появляется в некоторых более поздних документах XML)? Вывод 'заявителя', который я надеюсь получить, должен выглядеть примерно так:

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

1 Ответ

0 голосов
/ 04 марта 2012

Этот вопрос очень похож на Ваш другой вопрос .

Здесь есть две проблемы:

  1. Как перейти от "нестандартного XML" к "стандартному XML"?
  2. Как использовать XPath для получения текстовых значений элементов-потомков и их объединения?

Вам нужно решить 1, прежде чем атаковать 2. Если вам нужна помощь с этим, задайте отдельный вопрос.

«Нестандартный XML» - это то же самое, что , а не XML вообще . Вы не можете анализировать его как XML и не можете использовать XPath для него. Но вы сформулировали вопрос таким образом, чтобы это выглядело так, как будто вы пытаетесь это сделать в любом случае.

Предполагая, что ваш вопрос на самом деле касается работы со "стандартным XML", как насчет использования того же подхода, что и в моем ответе на другой вопрос ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...