使用 Python 的 etree 创建 XML 文件时,如果我们使用SubElement向文件写入一个空标签,我会得到:

<MyTag />

不幸的是,我们在 Fortran 中使用的 XML 解析器库不能处理这个问题,即使它是一个正确的标签。 它需要看到:

<MyTag></MyTag>

有没有办法更改格式规则或 etree 中的某些内容以使其工作?

#1楼 票数:18 已采纳

从 Python 3.4 开始,您可以对tostring()函数ElementTRee.write()方法使用short_empty_elements参数:

>>> from xml.etree import ElementTree as ET
>>> ET.tostring(ET.fromstring('<mytag/>'), short_empty_elements=False)
b'<mytag></mytag>'

在较旧的 Python 版本(2.7 到 3.3)中,作为一种变通方法,您可以使用html方法写出文档:

>>> from xml.etree import ElementTree as ET
>>> ET.tostring(ET.fromstring('<mytag/>'), method='html')
'<mytag></mytag>'

ElementTree.write()方法和tostring()函数都支持method关键字参数。

在更早版本的 Python(2.6 及更早版本)上,您可以安装外部 ElementTree 库; 1.3 版支持该关键字。

是的,这听起来有点奇怪,但是html输出主要输出空元素作为开始和结束标记。 一些元素仍然以空标签元素结束; 特别是<link/><input/><br/>等等。 尽管如此,还是升级您的 Fortran XML 解析器以实际解析符合标准的 XML!

#2楼 票数:5

这在 Python 3.4 中直接解决了。 从那时起, xml.etree.ElementTree.ElementTreewrite方法具有short_empty_elements参数:

控制不包含内容的元素的格式。 如果为 True(默认值),则它们作为单个自闭合标签发出,否则它们作为一对开始/结束标签发出。

xml.etree 文档中的更多详细信息。

#3楼 票数:2

如果您有可用的 sed,则可以将 python 脚本的输出通过管道传输到

sed -e "s/<\([^>]*\) \/>/<\1><\/\1>/g"

它将找到<Tag />任何出现并将其替换为<Tag></Tag>

#4楼 票数:2

添加空text是另一种选择:

etree.SubElement(parent, 'child_tag_name').text=''

但请注意,这不仅会改变表示形式,还会改变文档的结构:即child_el.text将是''而不是None

哦,就像 Martijn 所说的,尝试使用更好的库。

#5楼 票数:0

解释一下代码,我使用的ElementTree.py版本在_write方法中包含以下内容:

write('<' + tagname)
...
if node.text or len(node): # this line is literal
    write('>')
    ...
    write('</%s>' % tagname)
else:
    write(' />')

为了引导程序计数器,我创建了以下内容:

class AlwaysTrueString(str):
    def __nonzero__(self): return True
true_empty_string = AlwaysTrueString()

然后我在那些 ElementTree 节点上设置node.text = true_empty_string ,我想要一个打开-关闭标签而不是一个自关闭标签。

通过“引导程序计数器”,我的意思是构造一组输入——在​​这种情况下是一个带有一些奇怪的真实测试的对象——到一个库方法,这样库方法的调用就会按照我想要的方式遍历它的控制流图. 这非常脆弱:在库的新版本中,我的 hack 可能会中断——你可能应该将“可能”视为“几乎可以保证”。 一般来说,不要打破抽象障碍。 它只是在这里对我有用。

#6楼 票数:0

如果您有 python >=3.4,请使用其他答案中已经显示的short_empty_elements=False选项,但是:

  1. 如果您已经拥有字符串形式的 XML 并且无法触摸生成它的代码..
  2. 如果您陷入使用 python <3.4 的情况。
  3. 如果您使用的是其他坚持使用自闭合标签的 XML 库..

然后这有效:

 xml = "<foo/><bar/>"
 xml = re.sub(r'<([^\/]+)\/\>', r'<\1></\1>', xml)

 print(xml)

 # output will be
 # <foo></foo><bar></bar>

  ask by tpg2114 translate from so

未解决问题?本站智能推荐:

1回复

python:使用etree保留xml格式

我正在使用lxml etree格式化xml并修改一些值。 这是输入XML的代码段 码: 但是输出的形式为: 我尝试将其转换为字符串,然后使用etree,但得到的结果相同。 我希望它的格式与XML最初具有多行属性的格式相同。
3回复

python xml.etree.ElementTree 删除文本中间的空标签

我有一个 xml 文档,我想根据标签从中提取文本。 我想从中提取文本的部分看起来像这样: 当我做 我只能抓取空标签<TIP CONTENT=""/>之前的部分我试图在获取其余文本之前删除此标签。 我做了: 但这是行不通的。 <BlockText>和<TIP
2回复

Python:xml.etree.ElementTree销毁xml格式

我有一个格式为XML的ISM文件(InstallShield项目)。 我需要更改文件中的某些属性,因此我使用了xml.etree.ElementTree(Python库)。 我可以找到这些值并进行更改,但是,使用更新后的值保存文件后,无法在InstallShield中打开它(出现一个
5回复

python: xml.etree.elementtree.ElemenTtree.write() 声明标签

我已经使用 xml.etree.elementtree.Element 创建了一个 XML 文档,并想使用 ElementTree.write() 函数打印它,但出现的声明标记是 虽然我需要用双引号。 有没有办法改变它?
1回复

如何使用 xml.etree.ElementTree Python 格式化属性、前缀和标签

我正在尝试创建一个 python 脚本,该脚本将创建一个架构,然后根据现有引用填充数据。 这是我需要创建的: 这就是我所拥有的: 这给了我: <xsi:root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
3回复

xml.etree.ElementTree.ParseError:Python中格式不正确(无效的令牌)

我正在尝试使用ElementTree打开XML文件,但发生错误: xml.etree.ElementTree.ParseError:格式不正确(无效的令牌) 这是我的代码: 如何解决此错误?
1回复

python - xml.etree.ElementTree.ParseError:格式不正确(无效令牌)

我有以下代码: 我收到以下错误消息: 我在StackOverflow上检查了这个错误消息的所有问题,没有任何帮助: 我试着用另一个编辑器编辑文件( 这里建议); 我添加了这一行: tree.set('SignalStrength',"100") (从这里开始 )
1回复

如何使用xml.etree.ElementTree关闭python中的一个标签后如何提取嵌套xml中的文本

我想提取xml文档中的所有文本,并且在以下情况下出现问题: 在此代码段中,我可以获取文本“ hello”和“ there”,因为可以使用以下标记获取它们: 但我不知道如何访问“您今天过的怎么样”。 部分。