Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.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从XML节点提取文本_Python_Xml_Parsing_Minidom - Fatal编程技术网

Python 用minidom从XML节点提取文本

Python 用minidom从XML节点提取文本,python,xml,parsing,minidom,Python,Xml,Parsing,Minidom,我浏览了好几篇文章,但还没有找到解决我问题的答案 示例XML= <TextWithNodes> <Node id="0"/>TEXT1<Node id="19"/>TEXT2 <Node id="20"/>TEXT3<Node id="212"/> </TextWithNodes> 我得到的只是无。我已经读到,您必须编写a.childNodes.nodeValue,但是节点列表中没有子节点,因为它看起来像所有nodeid都

我浏览了好几篇文章,但还没有找到解决我问题的答案

示例XML=

<TextWithNodes>
<Node id="0"/>TEXT1<Node id="19"/>TEXT2 <Node id="20"/>TEXT3<Node id="212"/>
</TextWithNodes>
我得到的只是
。我已经读到,您必须编写
a.childNodes.nodeValue
,但是节点列表中没有子节点,因为它看起来像所有
node
id都是关闭标记?如果我使用
a.childNodes
我会得到
[]

当我得到
a
的节点类型时,它是类型1,
TEXT\u节点
=3。我不确定这是否有用


我想从文档中提取
TEXT1
TEXT2
lxml
解决方案:

from lxml import etree
from StringIO import StringIO

xml = etree.parse(StringIO('''<TextWithNodes>
<Node id="0"/>TEXT1<Node id="19"/>TEXT2 <Node id="20"/>TEXT3<Node id="212"/></TextWithNodes>'''))

xml.xpath("//text()")
Out[43]: ['\n', 'TEXT1', 'TEXT2 ', 'TEXT3']
这里的问题是XML中的文本不属于任何节点。

使用(这类似于@DiegoNavrro在回答中使用的lxml,除了标准库的一部分中有etree,并且没有XPATH等),您可以尝试以下操作:

import xml.etree.ElementTree as etree

xml_string = """<TextWithNodes>
<Node id="0"/>TEXT1<Node id="19"/>TEXT2 <Node id="20"/>TEXT3<Node id="212"/>
</TextWithNodes>
"""

xml_etree = etree.fromstring(xml_string)

text = [element.tail for element in xml_etree]
# `text` will be ['TEXT1', 'TEXT2 ', 'TEXT3', '\n']
将xml.etree.ElementTree导入为etree
xml_string=“”
text1text2text3
"""
xml\u etree=etree.fromstring(xml\u string)
text=[element.tail用于xml\u etree中的元素]
#'text'将是['TEXT1','TEXT2','TEXT3','\n']
注意,这假设XML
TEXT1
。。。这是正确的。由于文本跟随结束标记,因此它将成为标记的尾部文本。不是元素nodeValue,这就是为什么在问题中的代码中得到
None
s


如果您想解析一些XML,如
TEXT1
,您必须将行
[element.tail for element in XML\u etree]
替换为
[element.text for element in XML\u etree]

您的任务应该使用ElementTree api而不是minidom(如其他答案所述),但是如果您需要使用minidom,这里有一个解决方案

您要查找的内容已添加到DOM级别3中,作为。Minidom仅支持级别1

但是,您可以使用此函数非常接近地模拟textContent:

def textContent(node):
    if node.nodeType in (node.TEXT_NODE, node.CDATA_SECTION_NODE):
        return node.nodeValue
    else:
        return ''.join(textContent(n) for n in node.childNodes)
然后您可以这样使用:

x = minidom.parseString("""<TextWithNodes>
<Node id="0"/>TEXT1<Node id="19"/>TEXT2 <Node id="20"/>TEXT3<Node id="212"/></TextWithNodes>""")

twn = x.getElementsByTagName('TextWithNodes')[0]

assert textContent(twn) == u'\nTEXT1TEXT2 TEXT3'
x=minidom.parseString(“”)
text1text2text3“”)
twn=x.getElementsByTagName('TextWithNodes')[0]
断言textContent(twn)==u'\nTEXT1TEXT2 TEXT3'

注意我是如何获得父节点的文本内容的
TextWithNodes
。这是因为您的
节点
元素是这些文本节点的兄弟节点,而不是它们的父节点。

您的
TEXT1
TEXT2
等实际上不是任何元素的参与方。您的XML应该是
TEXT1TEXT2TEXT3
?另外,还有一个结束标记吗?另外,我强烈建议使用(标准库的一部分)在Python中处理XML。它是一个简单得多的Python接口。例如,在
xml.dom
中,您必须使用
element.childNodes.nodeValue
来获取与
元素相关联的文本,在etree中,这只是
element.text
。嗨,克里斯,谢谢,这正是我所想的,因为所有的结束标记都让我感到困惑。我不确定这个xml文件有多有效,它只是一个文本工程软件的输出,用于注释,我需要将其解析为excel。我将查看ElementTree。更准确地说,XML中的文本属于
TextWithNodes
元素,但不属于
Node
元素。文本节点和
节点
元素是兄弟节点,而不是父子元素。谢谢@FrancisAvila,我仍在尝试在xml结构的头脑中进行组织,这真的很有帮助@茉莉,可能是这样。我在末尾添加了
。如果您尝试我的代码,它会工作。当我尝试提取特定节点的文本时,我得到“无”?是的,因为XML中的节点是空的:
相同。你应该写一些东西,比如
TEXT1
文本提取到哪里?我不明白你说的“提取到”是什么意思。文本由
textContent
函数返回。
def textContent(node):
    if node.nodeType in (node.TEXT_NODE, node.CDATA_SECTION_NODE):
        return node.nodeValue
    else:
        return ''.join(textContent(n) for n in node.childNodes)
x = minidom.parseString("""<TextWithNodes>
<Node id="0"/>TEXT1<Node id="19"/>TEXT2 <Node id="20"/>TEXT3<Node id="212"/></TextWithNodes>""")

twn = x.getElementsByTagName('TextWithNodes')[0]

assert textContent(twn) == u'\nTEXT1TEXT2 TEXT3'