2012-02-17 4 views
1

Использование Python ElementTree для создания и редактирования тестовых сообщений:Поиск XML элемента конкретного значения атрибутов

Часть XML следующим образом:

<FIXML> 
<TrdMtchRpt TrdID="$$+TrdID#" RptTyp="0" TrdDt="20120201" MtchTyp="4" LastMkt="ABCD" LastPx="104.11"> 

Ключ TrdID содержат значения, начинающиеся с $$, чтобы определить, что это значение это переменные данные и их необходимо изменить после создания сообщения из шаблона, в этом случае следующего последовательного номера (хранящегося в словаре). Общая идея заключается в загрузке словаря из файла с указанным ключом атрибута и связанным с ним значение, такое как следующий последовательный номер, например, файл словаря содержит $$+TrdID# 12345, используя пространство как delim).

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

Как я могу найти элемент/атрибут, чтобы определить, содержит ли атрибут ключ, где соответствующее значение начинается с или содержит конкретную строку $$?

И по неизвестным мне причинам мы не можем использовать lxml!

ответ

1

Вы можете использовать XPath.

import lxml.etree as etree 
import StringIO from StringIO 

xml = """<FIXML> 
      <TrdMtchRpt TrdID="$$+TrdID#" 
         RptTyp="0" 
         TrdDt="20120201" 
         MtchTyp="4" 
         LastMkt="ABCD" 
         LastPx="104.11"/> 
     </FIXML>""" 

tree = etree.parse(StringIO(xml)) 

Чтобы найти элементы TrdMtchRpt где атрибут TrdID начинается с $$:

r = tree.xpath("//TrdMtchRpt[starts-with(@TrdID, '$$')]") 
r[0].tag == 'TrdMtchRpt' 
r[0].get("TrdID") == '$$+TrdID#' 

Если вы хотите, чтобы найти любой элемент, где по крайней мере один атрибут начинается с $$ вы можете сделать это:

r = tree.xpath("//*[starts-with(@*, '$$')]") 
r[0].tag == 'TrdMtchRpt' 
r[0].get("TrdID") == '$$+TrdID#' 

Посмотрите на документацию:

+0

Спасибо @Tichodroma, я изменил свой запрос, чтобы быть более конкретным, к сожалению, мне не разрешено использовать lxml. С уважением. –

+0

Нет XPath ?! Какой позор! –

+0

Спасибо, кажется, что это упражнение по изучению питона изучает то, что я не могу сделать с инструментами, которые мне даны! С уважением. –

1

Вы можете использовать ElementTree пакет. Он предоставляет вам объект с иерархической структурой данных из документа XML.

Смежные вопросы