【问题标题】:Extract name, value from XML file using xml.etree.ElementTree使用 xml.etree.ElementTree 从 XML 文件中提取名称、值
【发布时间】:2021-10-16 23:06:03
【问题描述】:

我在使用 Python 的 xml.etree.ElementTree 库从其中 name == 'mykey' 的 XML 中提取(名称,值)对时遇到问题。我想要的伪代码是:

if (name.text == 'mykey'):
   print value.text

Value 将是 mykey 的值,在本例中为 XX111。

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE charles-session SYSTEM "https://www.charlesproxy.com/dtd/charles-session-1_2.dtd">

<charles-session>
<header>
<name>Content-Length</name>
<value>10804</value>
</header>
<header>
<name>Date</name>
<value>Wed, 13 Oct 2021 22:02:42 GMT</value>
</header>
<header>
<name>mykey</name>
<value>XX111</value>
</header>
<header>
<name>Accept-Language</name>
<value>en-US;q=1.0, el-US;q=0.9</value>
</header>

我可以打印 'mykey' 文本,但我不知道怎么说“现在给我 'mykey' 之后的值文本。

for name in root_node.iter('name'):
    if re.match(r'mykey', name.text):
        print(name.text)

【问题讨论】:

  • 你能检查一下根设置在哪里吗?同样在代码中,您匹配name.text,然后打印相同,它不会给您mykey 的值。如果您的根设置为charles-session,那么以下将为您提供XX111。 sn-p for each in root.findall(".//header"): if "mykey" in each[0].text: print(each[1].text)
  • 根是 。这就是我执行以下操作时得到的结果:``` root_node = tree.getroot() print root_node ```
  • 您的解决方案有效,谢谢! :)
  • 我认为没有内置方法来获取行号,您可以探索how to get line number中列出的选项
  • 请看一下答案,这可能会有所帮助:)。

标签: python xml


【解决方案1】:

获取该元素所在的元素值和行号。

请看代码注释说明:

# Data setup
from io import StringIO
xml_data="""\
<?xml version="1.0" encoding="UTF-8"?>
<charles-session>
    <header>
    <name>Content-Length</name>
    <value>10804</value>
    </header>
    <header>
    <name>Date</name>
    <value>Wed, 13 Oct 2021 22:02:42 GMT</value>
    </header>
    <header>
    <name>mykey</name>
    <value>XX111</value>
    </header>
    <header>
    <name>Accept-Language</name>
    <value>en-US;q=1.0, el-US;q=0.9</value>
    </header>
</charles-session>
"""

现在获取要查找的元素及其值。

# define the root
root = ET.parse(StringIO(xml_data)).getroot()
# based on xpath get the key and its value
for each in root.findall(".//header"):
    if "mykey" in each[0].text:
        print(each[1].text)

get line number 调整了代码 信用@邓肯哈里斯

import sys
sys.modules['_elementtree'] = None
import xml.etree.ElementTree as ET

class LineNumberingParser(ET.XMLParser):
    def _start(self, *args, **kwargs):
        # Here we assume the default XML parser which is expat
        # and copy its element position attributes into output Elements
        element = super(self.__class__, self)._start(*args, **kwargs)# change for python 3
        element._start_line_number = self.parser.CurrentLineNumber
        element._start_column_number = self.parser.CurrentColumnNumber
        element._start_byte_index = self.parser.CurrentByteIndex
        return element

    def _end(self, *args, **kwargs):
        element = super(self.__class__, self)._end(*args, **kwargs)
        element._end_line_number = self.parser.CurrentLineNumber
        element._end_column_number = self.parser.CurrentColumnNumber
        element._end_byte_index = self.parser.CurrentByteIndex
        return element

tree = ET.parse('test.xml', parser=LineNumberingParser())

现在跟踪行号:即根+要查找的元素的行号。

tree_line_number=tree.getroot()._start_line_number
for each in tree.findall(".//header"):
    if "mykey" in each[0].text:
        print(f"{each[1].text} at line number -> {each._start_line_number+tree_line_number}")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 2015-05-26
    • 1970-01-01
    • 2018-12-06
    • 2018-12-31
    • 2015-06-18
    • 1970-01-01
    相关资源
    最近更新 更多