打印在xml python中没有属性的标记行

cgvd09ve  于 2022-12-20  发布在  Python
关注(0)|答案(2)|浏览(132)

让我们假设我们有xml文件:

<School Name = "school1">
  <Class Name = "class A">
    <Student Name = "student"/>
    <Student/>
    <!-- -->
  </Class>
</School>

我有一个使用解析的python脚本。我想打印一个标记的行。例如,我想打印没有“Name”属性的标记行。这可能吗?我看到一个继承ElementTree的例子,但不理解它。

import xml.etree.ElementTree as ET

def read_root(root):
  for x in root:
    print(x.lineNum)
    read_root(x)

def main():
  fn = "a.xml"
  try:
    tree = ET.parse(fn)
  except ET.ParseError as e:
    print("\nParse error:", str(e))
    print("while reading: " + fn)
    exit(1)
  root = tree.getroot()
  read_root(root)
nzk0hqpo

nzk0hqpo1#

你的问题太不清楚了,不管怎样,如果你只是想检查标签是否有Name属性,并且想打印那个行号,你可以使用lxml中的etree,如下所示:

from lxml import etree

doc = etree.parse('test.xml')

for element in doc.iter():
    # Check if the tag has a "Name" attribute
    if "Name" not in element.attrib:
        print(f"Line {element.sourceline}: {element.tag}"))

输出:

Line 4: Student
Line 5: <cyfunction Comment at 0x13b8e6dc0>
yacmzcpb

yacmzcpb2#

您需要一个类似ET.XMLPullParser的解析器,它可以读取"comment""process instructions""namespces""start""end"事件。
如果XML文件'comment.xml'如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<School Name = "school1">
  <Class Name = "class A">
    <Student Name = "student"/>
    <Student/>
    <!-- Comment xml -->
  </Class>
</School>

您可以进行解析以查找不带属性"Name"和注解的TAG's

import xml.etree.ElementTree as ET

#parser = ET.XMLPullParser(['start', 'end', "comment", "pi", "start-ns", "end-ns"])

parser = ET.XMLPullParser([ 'start', 'end', 'comment'])
with open('comment.xml', 'r', encoding='utf-8') as xml:
    feedstring = xml.readlines()
    
for line in enumerate(feedstring):
    parser.feed(line[1])

    for event, elem in parser.read_events():
        if elem.get("Name"):
            pass
        else:
            print(f"{line[0]} Event:{event} | {elem.tag}, {elem.text}")

输出:

4 Event:start | Student, None
4 Event:end | Student, None
5 Event:comment | <function Comment at 0x00000216C4FDA200>,  Comment xml

相关问题