Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在minidom中禁用“输出转义”_Python_Xml - Fatal编程技术网

Python 如何在minidom中禁用“输出转义”

Python 如何在minidom中禁用“输出转义”,python,xml,Python,Xml,我正在尝试使用xml.dom.minidom从头构建一个xml文档。在我尝试在中创建带有®注册商标符号的文本节点之前,一切都进展顺利。我的目标是,当我最终点击print mydoc.toxml时,这个特定节点实际上将包含一个®符号 首先,我尝试: import xml.dom.minidom as mdom data = '®' 这就产生了一个相当明显的错误: File "C:\src\python\HTMLGen\test2.py", line 3 SyntaxError: Non-AS

我正在尝试使用xml.dom.minidom从头构建一个xml文档。在我尝试在中创建带有®注册商标符号的文本节点之前,一切都进展顺利。我的目标是,当我最终点击print mydoc.toxml时,这个特定节点实际上将包含一个®符号

首先,我尝试:

import xml.dom.minidom as mdom
data = '®'
这就产生了一个相当明显的错误:

  File "C:\src\python\HTMLGen\test2.py", line 3
SyntaxError: Non-ASCII character '\xae' in file C:\src\python\HTMLGen\test2.py on line 3, but no encoding declared; see http://www.python.or
g/peps/pep-0263.html for details
当然,我也尝试过使用开行注释方法将python脚本的编码更改为“utf-8”,但这没有帮助

所以我想

import xml.dom.minidom as mdom

data = '®'  #Both accepted xml encodings for registered trademark
data = '®'

text = mdom.Text()
text.data = data

print data
print text.toxml()
但因为当我打印text.toxml时,符号被转义,所以我得到以下输出:

®
®
我的问题是,有没有人知道一种方法,我可以强制在输出中不转义符号,这样我就可以将我的特殊字符引用传递到XML文档

基本上,对于这个节点,我希望print text.toxml生成®;的输出;或174英镑;以愉快和合作的方式

编辑1:

顺便说一句,如果minidom实际上没有这个功能,我非常乐意使用另一个模块,您可以推荐它

编辑2:

正如Hugh所建议的,我尝试使用data=u'®同时也使用data-*-编码:utf-8-*-Python源标记。这几乎有助于将®符号本身输出到我的xml。这其实不是我想要的结果。正如您现在可能已经猜到的,也许我应该在前面指定此xml文档恰好是一个HTML页面,它需要在浏览器中工作。因此,准确地说,文档中的®最终会导致浏览器中的垃圾

我还尝试:

data = unichr(174)
text.data = data.encode('ascii','xmlcharrefreplace')
print text.toxml()
但是,这当然会导致相同的原始问题,即所有发生的事情都是通过.toxml逃逸符号

我的理想方案是以某种方式跳过符号,这样XML打印功能就不会代表我的文档跳过符号,换句话说,实现了我最初的目标®;或174英镑;出现在文档中

看来很快我就要求助于正则表达式了

编辑2a:


或许不是。似乎正确获取html元信息可能会有所帮助,但我还不确定这是否适合xml结构…

如果我理解正确,您真正想要的是能够从unicode对象(如u'®或u'\u00ae)创建文本节点,然后将toxml输出unicode字符编码为实体(如&174;);。但是,从minidom.py的源代码来看,minidom似乎不支持输出上的实体编码,除了&、

不过,您也会询问其他可能有帮助的模块。有几个可能的候选者,但是xml.etree似乎进行了适当的编码。例如,如果从中选取第一个示例,但替换为:

child_with_tail.text = 'This child has regular text.'
。。。与:

child_with_tail.text = u'This child has regular text \u00ae.'
。。。然后运行脚本,您应该会看到输出包含:

This child has regular text®.
您也可以在该示例中使用,只需将import语句替换为:

from lxml.etree import Element, SubElement, Comment, tostring

更新:另一种方法采用了很好的运行方式。在minidom的toxml输出上编码“ascii”,“xmlcharrefreplace”,将任何非ascii字符转换为其等效的XML数字字符引用。

如果我理解正确,您真正想要的是能够从unicode对象(如u'®或u'\u00ae)创建文本节点,然后将toxml输出unicode字符编码为实体(如&174;);。但是,从minidom.py的源代码来看,minidom似乎不支持输出上的实体编码,除了&、

不过,您也会询问其他可能有帮助的模块。有几个可能的候选者,但是xml.etree似乎进行了适当的编码。例如,如果从中选取第一个示例,但替换为:

child_with_tail.text = 'This child has regular text.'
。。。与:

child_with_tail.text = u'This child has regular text \u00ae.'
。。。然后运行脚本,您应该会看到输出包含:

This child has regular text®.
您也可以在该示例中使用,只需将import语句替换为:

from lxml.etree import Element, SubElement, Comment, tostring

更新:另一种选择是采用很好的运行方式。在minidom的toxml输出上编码“ascii”,“xmlcharrefreplace”,将任何非ascii字符转换为其等效的XML数字字符引用。

两个选项都有效,一个带有转义&174;另一个没有。你为什么要逃跑还不太清楚。。。对于非CJK字符,它是6个字节,而不是2或3个字节

import xml.dom.minidom as mdom
text = mdom.Text()
# Start with unicode
text.data = u'\xae'

f = open('reg1.html', 'w')
f.write("header saying the file is ascii")
uxml = text.toxml()
bxml = uxml.encode('ascii', 'xmlcharrefreplace')
f.write(bxml)
f.close()

f = open('reg2.html', 'w')
f.write("header saying the file is UTF-8")
xml = text.toxml(encoding='UTF-8')
f.write(xml)
f.close()

两个选项都有效,一个是带转义的&174;另一个没有。你为什么要逃跑还不太清楚。。。对于非CJK字符,它是6个字节,而不是2或3个字节

import xml.dom.minidom as mdom
text = mdom.Text()
# Start with unicode
text.data = u'\xae'

f = open('reg1.html', 'w')
f.write("header saying the file is ascii")
uxml = text.toxml()
bxml = uxml.encode('ascii', 'xmlcharrefreplace')
f.write(bxml)
f.close()

f = open('reg2.html', 'w')
f.write("header saying the file is UTF-8")
xml = text.toxml(encoding='UTF-8')
f.write(xml)
f.close()
默认unescape:

from xml.sax.saxutils import unescape
unescape("< & >")
结果是,

'< & >'
检查此处的详细信息,

默认unescape:

from xml.sax.saxutils import unescape
unescape("&lt; &amp; &gt;")
结果是,

'< & >'

检查此处的详细信息,

您是否尝试过声明data=u'®'我只是尝试了很多事情,都没有成功,更新问题…您是否尝试过声明data=u'®'I j
ust尝试了很多东西,都没有成功,更新了问题……我不认为他说的是拥有174英镑;相反,提问者说,基本上,对于这个节点,我希望print text.toxml生成®;的输出;或174英镑;以愉快和合作的方式!在编辑2的末尾重复这一点:@Mark:正如你所见,我已经注意到了这一点,并修复了评论。代码不需要更改。选项1正是他想要的。你同意吗?对不起,我想你的更新是在我写评论的时候。是的,这是一个很好的解决方案+1-你介意我在我的最后添加一个简短的参考你的第一个解决方案吗?我认为我的答案仍然有有用的内容。谢谢!真正的问题是,我太专注于数据=“&174;”而不是首先使用unicode data=u'\xae'。我想我一定是因循守旧了。您的第一个代码示例对我帮助很大。我不认为他说的是拥有174英镑;相反,提问者说,基本上,对于这个节点,我希望print text.toxml生成®;的输出;或174英镑;以愉快和合作的方式!在编辑2的末尾重复这一点:@Mark:正如你所见,我已经注意到了这一点,并修复了评论。代码不需要更改。选项1正是他想要的。你同意吗?对不起,我想你的更新是在我写评论的时候。是的,这是一个很好的解决方案+1-你介意我在我的最后添加一个简短的参考你的第一个解决方案吗?我认为我的答案仍然有有用的内容。谢谢!真正的问题是,我太专注于数据=“&174;”而不是首先使用unicode data=u'\xae'。我想我一定是因循守旧了。您的第一个代码示例对我帮助很大。也感谢您的输入!如果我更聪明的话,我可能会从一开始就使用xml.etree,但在我想要这个html生成代码之前,我只有一周左右的时间。。在线感谢您的输入!如果我更聪明的话,我可能会从一开始就使用xml.etree,但在我想要这个html生成代码之前,我只有一周左右的时间。。在线 的