2 개의 기준과 일치하는 tag = ITEM을 찾아이 find를 기반으로 parent 태그 = NODE @ name을 가져와야합니다.ElementTree AND와 'parent'를 사용하여 노드 (XPATH)를 검색하는 더 좋은 방법
두 가지 문제 : 내가 할 '와'하는 XPath를위한 방법을 찾을 수 없습니다
, 예를
item = node.findall('./ITEM[@name="toppas_type" and @value="output file list"]')
명시 적으로 검색 할 필요없이 부모 노드 정보를 얻기위한 항목을 찾기 전에 미리 저장하십시오. 예 :
parent_name = item.parent.attrib['name']
@Mathias 뮐러 :
node_names = []
for node in tree.findall('NODE[@name="vertices"]/NODE'):
for item in node.findall('./ITEM[@name="toppas_type"]'):
if item.attrib['name'] == 'toppas_type' and item.attrib['value'] == 'output file list':
node_names.append(node.attrib['name'])
는 ... 이런 파일 (조각 만) ...
<?xml version="1.0" encoding="ISO-8859-1"?>
<PARAMETERS version="1.6.2" xsi:noNamespaceSchemaLocation="http://open-ms.sourceforge.net/schemas/Param_1_6_2.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<NODE name="vertices" description="">
<NODE name="23" description="">
<ITEM name="recycle_output" value="false" type="string" description="" required="false" advanced="false" />
<ITEM name="toppas_type" value="tool" type="string" description="" required="false" advanced="false" />
<ITEM name="tool_name" value="FileConverter" type="string" description="" required="false" advanced="false" />
<ITEM name="tool_type" value="" type="string" description="" required="false" advanced="false" />
<ITEM name="x_pos" value="-620" type="double" description="" required="false" advanced="false" />
<ITEM name="y_pos" value="-1380" type="double" description="" required="false" advanced="false" />
</NODE>
<NODE name="24" description="">
<ITEM name="recycle_output" value="false" type="string" description="" required="false" advanced="false" />
<ITEM name="toppas_type" value="output file list" type="string" description="" required="false" advanced="false" />
<ITEM name="x_pos" value="-440" type="double" description="" required="false" advanced="false" />
<ITEM name="y_pos" value="-1480" type="double" description="" required="false" advanced="false" />
<ITEM name="output_folder_name" value="" type="string" description="" required="false" advanced="false" />
</NODE>
<NODE name="33" description="">
<ITEM name="recycle_output" value="false" type="string" description="" required="false" advanced="false" />
<ITEM name="toppas_type" value="merger" type="string" description="" required="false" advanced="false" />
<ITEM name="x_pos" value="-620" type="double" description="" required="false" advanced="false" />
<ITEM name="y_pos" value="-1540" type="double" description="" required="false" advanced="false" />
<ITEM name="round_based" value="false" type="string" description="" required="false" advanced="false" />
</NODE>
<!--(snip)-->
</NODE>
</PARAMETERS>
UPDATE 구문 분석 :
이 코드는 내가 지금 가지고 있습니다
좋은 제안 - 불행히도 XML 파일을로드하려고하면 오류가 발생합니다. 나는 lxml에 익숙하지 않다. 그래서 나는 그것을 올바르게 사용하고 있는지 확신 할 수 없다.
from lxml import etree
root = etree.DTD("/Users/mikes/Documents/Eclipseworkspace/Bioproximity/Assay-Workflows-Mikes/protein_lfq/protein_lfq-1.1.2.toppas")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "src/lxml/dtd.pxi", line 294, in lxml.etree.DTD.__init__ (src/lxml/lxml.etree.c:187024)
lxml.etree.DTDParseError: Content error in the external subset, line 2, column 1
불행하게도, ElementTree는 tree.find 아마 당신이 전혀 중첩 루프가 필요하지 않습니다
당신이 무엇인지를 명확하게 보여주십시오 여기
lxml
함께 할 수있는 방법입니다 여기에 포함 된 입력 문서를 정확하게 입력하면 출력이 좋을 것입니다. 감사. –