Python的ElementTree的不喜欢处理指令

下面的代码名称冒号:Python的ElementTree的不喜欢处理指令

import xml.etree.ElementTree as ET 

xml = '''\

<?xml version="1.0" encoding="UTF-8"?>

<testCaseConfig>

<?LazyComment Blah de blah/?>

<testCase runLimit="420" name="d1/n1"/>

<testCase runLimit="420" name="d1/n2"/>

</testCaseConfig>'''

root = ET.fromstring(xml)

xml2 = xml.replace('LazyComment ', 'LazyComment:')

print(xml2)

try:

root2 = ET.fromstring(xml2)

except ET.ParseError:

print("\nERROR in xml2!!!\n")

xml3 = xml2.replace('testCaseConfig', 'testCaseConfig xmlns:Blah="http://www.w3.org/TR/html4/"', 1)

print(xml3)

try:

root3 = ET.fromstring(xml3)

except ET.ParseError:

print("\nERROR in xml3!!!\n")

raise

给出了这样的输出:

<?xml version="1.0" encoding="UTF-8"?> 

<testCaseConfig>

<?LazyComment:Blah de blah/?>

<testCase runLimit="420" name="d1/n1"/>

<testCase runLimit="420" name="d1/n2"/>

</testCaseConfig>

ERROR in xml2!!!

<?xml version="1.0" encoding="UTF-8"?>

<testCaseConfig xmlns:Blah="http://www.w3.org/TR/html4/">

<?LazyComment:Blah de blah/?>

<testCase runLimit="420" name="d1/n1"/>

<testCase runLimit="420" name="d1/n2"/>

</testCaseConfig>

ERROR in xml3!!!

Traceback (most recent call last):

File "C:\Users\Paddy3118\Google Drive\Code\elementtree_error.py", line 30, in <module>

root3 = ET.fromstring(xml3)

File "C:\Anaconda3\envs\Py3.5\lib\xml\etree\ElementTree.py", line 1333, in XML

parser.feed(text)

xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 3, column 17

我搜查,发现this Q是指出了我读其他资源。

看来'?'使其成为标签名称可以包含冒号的处理指令。没有'?'那么名称中的冒号表示名称空间,并且其中一个答案指出定义名称空间应该使事情有效。

结合'?'和':'虽然会导致ElementTree出现问题。

我给出了这种类型的xml文件,这些xml文件被其他工具使用,这些工​​具可以解析它并且想使用Python自己处理这些文件。有任何想法吗?

谢谢。

回答:

根据W3C可扩展标记语言1.0规格Common Syntactic Constructs下:

的命名空间在XML建议[XML名称]给包含冒号字符的名称赋予一个含义。因此,除命名空间以外,作者不应在XML名称中使用冒号,但XML 处理器必须接受冒号作为名称字符。

并进一步在W3C的XPath 1.0注意到关于Processing Instruction nodes:

处理指令有一个扩展名:本地部分是 处理指令的目标;名称空间URI为空。

总而言之,<?LazyComment:Blah de blah/?>是一个无效的处理指令,因为冒号用于引用命名空间URI并处理部分为null或空的指令。因此,Python的XML处理器抱怨说使用这样的指令并不能生成格式良好的XML。

此外,请重新考虑这样的工具,因为它们没有处理有效的XML文档,因此会生成这样的无效处理指令。可能的是,这些工具将XML文件视为文本文档(类似于您可以替换XML的字符串表示的方式,但不能使用etree附加指令)。

回答:

<?xml version="1.0" encoding="UTF-8"?> 

<testCaseConfig xmlns:Blah="http://www.w3.org/TR/html4/">

<?LazyComment:Blah de blah/?>

<testCase runLimit="420" name="d1/n1"/>

<testCase runLimit="420" name="d1/n2"/>

</testCaseConfig xmlns:Blah="http://www.w3.org/TR/html4/">

无效的XML。结束标记中不能有属性。最后一行应该只是</testCaseConfig>

而且注释写成这样

<!-- this is a comment --> 

以上是 Python的ElementTree的不喜欢处理指令 的全部内容, 来源链接: utcz.com/qa/257235.html

回到顶部