如何使用Python在XML上迭代(使用XML.dom.minidom)来测试子节点的存在性
我正在使用Python和xml.dom.minidom对导出的Excel电子表格进行迭代,为餐厅菜单输出一个HTML表格,并对.write进行各种调用。困难在于Excel输出的XML不是结构化的。为了补偿这一点,我设置了许多变量(day、previousDay、mean等),当我遇到子节点时,这些变量会被设置为具有我正在测试的nodeValue。我有一堆if语句来确定何时开始一个新表(一周中的每一天),或者新行(when day!=previousDay)等等 我很难弄清楚如何忽略特定的节点。有几个节点从Excel中获取输出,我需要忽略它们,我可以根据它们的子节点具有特定值来完成这项工作,但我不知道如何实现它 基本上,我需要在主for循环中使用以下if语句:如何使用Python在XML上迭代(使用XML.dom.minidom)来测试子节点的存在性,python,xml,minidom,Python,Xml,Minidom,我正在使用Python和xml.dom.minidom对导出的Excel电子表格进行迭代,为餐厅菜单输出一个HTML表格,并对.write进行各种调用。困难在于Excel输出的XML不是结构化的。为了补偿这一点,我设置了许多变量(day、previousDay、mean等),当我遇到子节点时,这些变量会被设置为具有我正在测试的nodeValue。我有一堆if语句来确定何时开始一个新表(一周中的每一天),或者新行(when day!=previousDay)等等 我很难弄清楚如何忽略特定的节点。有
for node in dome.getElementsByTagName('data'):
if node contains childNode with nodeValue == 'test':
do something
我的快速倾向是使用一个嵌套的for循环和一个无节点获取卡(嗯,异常),如下所示
Class BadNodeException (Exception):
pass
for node in dome.getElementsByTagName('data'):
try:
for child in node.childNodes:
if child.nodeValue == 'test':
raise BadNodeException
## process node as normal
except BadNodeException:
pass
我的快速倾向是使用一个嵌套的for循环和一个无节点获取卡(嗯,异常),如下所示
Class BadNodeException (Exception):
pass
for node in dome.getElementsByTagName('data'):
try:
for child in node.childNodes:
if child.nodeValue == 'test':
raise BadNodeException
## process node as normal
except BadNodeException:
pass
您必须使用
xml.dom.minidom
?因为这是XPath的亮点。例如,使用lxml.etree
,可以找到您想要的所有元素:
my_elements = document.xpath("//data[not(*[.='test'])]")
W3C的DOM很难用于实际问题,因为它不包括简单的东西,比如返回元素值的属性。(XPath声明一个元素的值是其所有连接在一起的子文本节点,这就是上述模式工作的原因。)
您需要为这类事情实现一个helper函数,例如:
def element_text(e):
return "".join(t.nodeValue for t in e.childNodes if t.nodeType == Node.TEXT_NODE)
这使得构建过滤器功能更容易,例如:
def element_is_of_interest(e):
return not any((c for c in e.childNodes if element_text(c) == "test"))
并获得如下元素:
my_elements = filter(element_is_of_interest, d.getElementsByTagName("data"))
您必须使用
xml.dom.minidom
?因为这是XPath的亮点。例如,使用lxml.etree
,可以找到您想要的所有元素:
my_elements = document.xpath("//data[not(*[.='test'])]")
W3C的DOM很难用于实际问题,因为它不包括简单的东西,比如返回元素值的属性。(XPath声明一个元素的值是其所有连接在一起的子文本节点,这就是上述模式工作的原因。)
您需要为这类事情实现一个helper函数,例如:
def element_text(e):
return "".join(t.nodeValue for t in e.childNodes if t.nodeType == Node.TEXT_NODE)
这使得构建过滤器功能更容易,例如:
def element_is_of_interest(e):
return not any((c for c in e.childNodes if element_text(c) == "test"))
并获得如下元素:
my_elements = filter(element_is_of_interest, d.getElementsByTagName("data"))
您考虑过使用SAX解析器吗?Sax解析器按照节点的出现顺序(深度优先)处理XML树结构,并允许您在解析时处理节点值
您是否考虑过改用SAX解析器?Sax解析器按照节点的出现顺序(深度优先)处理XML树结构,并允许您在解析时处理节点值