python报告XML nod的起始行/列

2024-05-23 09:06:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我当前正在使用xml.dom.minidom在python中解析一些XML。解析之后,我对内容做了一些报告,并希望报告源XML文档中标记开始的行(和列),但我看不出这是怎么可能的。在

我想坚持下去xml.dom文件/ xml.dom.minidom如果可能的话,但是如果我需要使用SAX解析器来获取源信息,我可以这样做——理想的情况是使用SAX跟踪节点位置,但最终还是会得到一个用于后期处理的DOM。在

有什么建议吗?希望我只是忽略了文档中的一些内容,这非常简单。在


Tags: 文件文档标记信息解析器内容节点报告
2条回答

通过monkeypatch minidom内容处理程序,我可以记录每个节点的行和列号(作为“parse_position”属性)。有点脏,但我看不出有什么“官方认可”的方式来做:)这是我的测试脚本:

from xml.dom import minidom
import xml.sax

doc = """\
<File>
  <name>Name</name>
  <pos>./</pos>
</File>
"""


def set_content_handler(dom_handler):
    def startElementNS(name, tagName, attrs):
        orig_start_cb(name, tagName, attrs)
        cur_elem = dom_handler.elementStack[-1]
        cur_elem.parse_position = (
            parser._parser.CurrentLineNumber,
            parser._parser.CurrentColumnNumber
        )

    orig_start_cb = dom_handler.startElementNS
    dom_handler.startElementNS = startElementNS
    orig_set_content_handler(dom_handler)

parser = xml.sax.make_parser()
orig_set_content_handler = parser.setContentHandler
parser.setContentHandler = set_content_handler

dom = minidom.parseString(doc, parser)
pos = dom.firstChild.parse_position
print("Parent: '{0}' at {1}:{2}".format(
    dom.firstChild.localName, pos[0], pos[1]))
for child in dom.firstChild.childNodes:
    if child.localName is None:
        continue
    pos = child.parse_position
    print "Child: '{0}' at {1}:{2}".format(child.localName, pos[0], pos[1])

它输出以下内容:

^{pr2}$

解决这个问题的另一种方法是在解析文档之前将行号信息修补到文档中。想法如下:

LINE_DUMMY_ATTR = '_DUMMY_LINE' # Make sure this string is unique!
def parseXml(filename):
  f = file.open(filename, 'r')
  l = 0
  content = list ()
  for line in f:
    l += 1
    content.append(re.sub(r'<(\w+)', r'<\1 ' + LINE_DUMMY_ATTR + '="' + str(l) + '"', line))
  f.close ()

  return minidom.parseString ("".join(content))

然后可以使用

^{pr2}$

很明显,这种方法有自己的缺点,如果您真的也需要列号,那么在中进行修补会更加复杂。另外,如果要提取文本节点或注释或使用Node.toXml(),则必须确保从任何意外匹配中去掉LINE_DUMMY_ATTR。在

与aknuds1的答案相比,这个解决方案的一个优点是它不需要弄乱minidom内部结构。在

相关问题 更多 >

    热门问题