【问题标题】:How to detect the root xml element of <?xml version="1.0" encoding="UTF-8"?> using Python and ElementTree如何使用 Python 和 ElementTree 检测 <?xml version="1.0" encoding="UTF-8"?> 的根 xml 元素
【发布时间】:2014-03-23 17:55:31
【问题描述】:

我正在解析一个 XML 文件,我希望根元素是 &lt;data&gt;。但是,一些用户修改了这些文件并在顶部添加了元素&lt;?xml version="1.0" encoding="UTF-8"?&gt;。我想检查它是否存在,然后我的测试失败以通知用户这个问题。我尝试执行以下操作,但它不断检测&lt;data&gt; 的正确根元素。这是我目前所拥有的。

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

elementTree = self.param2
root = elementTree.find('.')

print root.tag

我要打印的是:

data 

(这不是我所期望的)。

任何想法都将不胜感激!

【问题讨论】:

  • tree = ET.parse(xmlFile), root = tree.getroot(), print root.tag
  • 尝试了您的建议,我得到了相同的结果。我在根标记处得到“数据”,而不是预期的“xml”部分。
  • 你的意思是:&lt;?xml version="1.0" encoding="UTF-8"?&gt;?这只是 XML 文件的标题,它不是元素
  • 是的。抱歉,我将它定义为元素,但我想你是对的,它是标题。想知道在 xml 文件中检测它的最佳方法是什么?
  • &lt;?xml ...? 行称为XML declaration。它不是根,因此您可以放心地忽略它。

标签: python xml xml-parsing elementtree


【解决方案1】:

如果您使用正确的 XML API,例如 xml.domElementTree,则处理 XML 声明 应该没有任何问题。但是,如果您仍然坚持删除声明,请尝试以下操作:

from xml.dom import minidom

def remove_xml_declaration(xml_text):
    doc = minidom.parseString(xml_text)
    root = doc.documentElement
    xml_text_without_declaration = root.toxml(doc.encoding)
    return xml_text_without_declaration

#
# Test
#

xml_text = '''<?xml version="1.0" encoding="UTF-8"?>
<data>
</data>
'''

# Remove declaration
xml_text = remove_xml_declaration(xml_text)
print xml_text
print '---'

# Remove declaration, event if it is not there
xml_text = remove_xml_declaration(xml_text)
print xml_text
print '---'

【讨论】:

  • 谢谢你的好例子。
【解决方案2】:

嗯,我感谢所有的回复。但是,我不想删除它,我只想检测它并让用户/开发人员删除它。这是我为检测它所做的。

import re

# The beginning of an XML Declaration to match.
xmlRegex = '(<\\?xml)'
rg = re.compile(xmlRegex, re.IGNORECASE | re.DOTALL)

lineCount = 0
with open("c:\file.xml") as f:
    for line in f:
        lineCount += 1
        match = rg.search(line)

        if match:
            self.assertTrue(False, logger.failed("An XML Declaration was detected on line: " + str(lineCount) + "."))
            else:
                pass

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多