当前位置: 首页 > 面试题库 >

使用Python / ElementTree解析XML时如何保留注释

柳星晖
2023-03-14
问题内容

当前使用Python 2.4.3,并且不允许升级

我想更改一个或多个标记中给定属性的值,以及更新文件中的XML注释。

我设法创建了一个以XML文件作为参数的Python脚本,并且为每个指定的标签更改了一个属性,如下所示

def update(file, state):
    global Etree
    try:
        from elementtree import ElementTree
        print '*** using ElementTree'
    except ImportError, e:
        print '***'
        print '*** Error: Must install either ElementTree or lxml.'
        print '***'
        raise ImportError, 'must install either ElementTree or lxml'
    #end try

    doc = Etree.parse(file)
    root = doc.getroot()

    for element in root.findall('.//StateManageable'):
        element.attrib['initialState'] = state
    #end for
    doc.write(file)
#end def

一切都很好,属性“ initialState”已更新,除了我的原始XML也包含许多XML注释的事实,但它们早已消失了,这是不好的。

怀疑只能解析XML结构,但我认为XML注释是该结构的一部分。我还意识到我的原始文档的“人类可读”格式已经不复存在,但是我已经意识到这是预期的行为,需要在以后使用xmllint –formatXSL进行格式化。


问题答案:

我知道这已经很老了,但是我偶然发现了上面有关如何保留评论的答案。弗雷德里克(Frederik)已发布的有关如何在树中添加注释的说明仍适用于当前版本的ElementTree,但至少要超出我的使用范围。它将XML包装在一个元素中,这对我来说是不可取的。我也不需要保留处理指令,而只需注释。因此,我减少了他在网站上提供的课程:

import xml.etree.ElementTree as ET

class PCParser(ET.XMLTreeBuilder):

   def __init__(self):
       ET.XMLTreeBuilder.__init__(self)
       # assumes ElementTree 1.2.X
       self._parser.CommentHandler = self.handle_comment

   def handle_comment(self, data):
       self._target.start(ET.Comment, {})
       self._target.data(data)
       self._target.end(ET.Comment)

要使用此方法,请将该对象的实例创建为“解析器”,然后将其作为参数传递给ElementTree.parse(),如下所示:

parser = PCParser()
self.tree = ET.parse(self.templateOut, parser=parser)

我对代码或对ElementTree的未记录使用一无所知,但这对我有用,它只保留注释而不影响原始文档的结构。并注意,将来对ElementTree的任何更改(尽管在所有这些年来似乎都不太可能)将打破这一点。



 类似资料:
  • 本文向大家介绍Python中使用ElementTree解析XML示例,包括了Python中使用ElementTree解析XML示例的使用技巧和注意事项,需要的朋友参考一下 【XML基本概念介绍】 XML 指可扩展标记语言(eXtensible Markup Language)。 XML 被设计用来传输和存储数据。 概念一: 概念二: 概念三: 概念四: 概念五: 概念六: 【XML几种解析方法】

  • 问题内容: 我很难找到一个很好的基本示例,说明如何使用元素树在python中解析XML。据我所知,这似乎是用于解析XML的最简单的库。这是我正在使用的XML的示例: 我可以使用硬编码的方法来做我需要的事情。但是我需要我的代码更具动态性。这是起作用的: 这是我尝试过的几件事,但都没有奏效,报告他们找不到timeSeries(或我尝试过的其他任何东西): 基本上,我想加载xml文件,搜索timeSer

  • 问题内容: 我想在处理XML时尽可能忠实地保留注释。 我设法保留了注释,但是内容已被XML转义。 但是,像这样的注释: 最终为: 我也尝试过,但似乎没有任何作用。实际上,我认为问题出在步骤之后的某个地方。 顺便说一句,这个问题与此类似。 问题答案: 经过Python 2.7和3.5的测试,以下代码应该可以正常工作。 然后,在主代码中使用 作为解析器,而不是当前的解析器。 顺便说一下,使用开箱即用的

  • 问题内容: 我正在尝试开发简单的Python(3.2)代码以读取XML文件,进行一些 更正 并将其存储回去。但是,在存储步骤中,ElementTree添加此命名空间命名法。例如: 该代码段如下: 我尝试使用,但没有任何积极结果。此版本的ElementTree 1.3是否有任何特定更改? 问题答案: 为了避免使用前缀,应 在 读取XML数据 之前 设置默认名称空间。

  • 问题内容: 对于: 我如何获得“价值”? 引发错误。 问题答案: 这将找到名为的元素的第一个实例,并返回该属性的值。

  • 我已经尝试解析一些XML好几个小时了,但运气不好。检查了类似的线程并查看了ElementTree文档,但仍然很失落。 基本上,我从路由器接收到一些XML输出,这些输出存储在一个字符串中,然后我必须对其进行解析,以获得一些特定的信息。 下面是我正在研究的xml示例: 例如,我想要获取/打印内容的节点是rt目的地。 我试过: 这个, 这是设置根(指针?)在特定节点上, 关于如何遍历到此特定节点或如何获