Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.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在XML上迭代(使用XML.dom.minidom)来测试子节点的存在性_Python_Xml_Minidom - Fatal编程技术网

如何使用Python在XML上迭代(使用XML.dom.minidom)来测试子节点的存在性

如何使用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)等等 我很难弄清楚如何忽略特定的节点。有

我正在使用Python和xml.dom.minidom对导出的Excel电子表格进行迭代,为餐厅菜单输出一个HTML表格,并对.write进行各种调用。困难在于Excel输出的XML不是结构化的。为了补偿这一点,我设置了许多变量(day、previousDay、mean等),当我遇到子节点时,这些变量会被设置为具有我正在测试的nodeValue。我有一堆if语句来确定何时开始一个新表(一周中的每一天),或者新行(when day!=previousDay)等等

我很难弄清楚如何忽略特定的节点。有几个节点从Excel中获取输出,我需要忽略它们,我可以根据它们的子节点具有特定值来完成这项工作,但我不知道如何实现它

基本上,我需要在主for循环中使用以下if语句:

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树结构,并允许您在解析时处理节点值