Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.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标记?_Python_Xml_Parsing - Fatal编程技术网

如何在Python中解析所有XML标记?

如何在Python中解析所有XML标记?,python,xml,parsing,Python,Xml,Parsing,我想完全解析XML文件并提取所有标记的值。我有提取我提到的标签值的代码。但是我想提取所有标签的所有值。手动提及所有标签并提取是不可能的,对吗?这就是为什么我需要知道怎么做。请帮帮我 提前感谢 PYTHON代码: from xml.dom import minidom document = minidom.parse("forms.xml") def findChildNodeByName(parent, name): for node in parent.childNodes:

我想完全解析XML文件并提取所有标记的值。我有提取我提到的标签值的代码。但是我想提取所有标签的所有值。手动提及所有标签并提取是不可能的,对吗?这就是为什么我需要知道怎么做。请帮帮我

提前感谢

PYTHON代码:

from xml.dom import minidom
document = minidom.parse("forms.xml")

def findChildNodeByName(parent, name):
    for node in parent.childNodes:
            if node.nodeType == node.ELEMENT_NODE and         node.localName == name:
                    return node
    return None

def getText(nodelist):
    rc = []
    for node in nodelist:
            if node.nodeType == node.TEXT_NODE:
                    rc.append(node.data)
    return ''.join(rc)

 titles =[]

servers = document.getElementsByTagName('servers')

for server in servers:
        item1 = server.getElementsByTagName("server")
        print item1
        for item2 in item1:
                value = item2.getElementsByTagName("host")   [0].childNodes[0].data
            print value
            titles.append(value)


print titles
XML文件:

    <servers>
      <server>
        <host> HOST1 </host>
       <port> 6667 </port>
        <channel>
          <name> CHANNAME1</name>
        </channel>
       <channel>
          <name> CHANNAME2 </name>
        </channel>
  </server>
      <server>
<host> HOST2 </host>
<port> 6667 </port>
<channel>
  <name> CHANNAME3 </name>
</channel>
听起来lxml.etree.iterparse是你的朋友

要大致引用文档中我自己添加的任何bug:

from lxml import etree
from StringIO import StringIO

xml = '''
<root>
  <element key='value'>text</element>
  <element>text</element>tail
  <empty-element xmlns="http://testns/" />
</root>
'''

context = etree.iterparse(StringIO(xml))
for action, elem in context:
    print("%s: %s (attribs: %r; text: %r)"
          % (action, elem.tag, elem.attrib, elem.text))
…将遍历每个元素,显示其属性和文本。值得注意的是,本例中的代码没有对names元素、key、empty元素等进行硬编码


如果您关心上下文,请使用堆栈记录您所处的元素中哪些元素看到了开始而不是结束的动作。

@JohnZwinck我很欣赏您的想法。!但是我特别希望它是Python的。帮助我们帮助你。显示到目前为止您所拥有的代码,以及这些代码与您想要的代码之间的差距。您搜索过Python XML库吗?它们中是否有你无法理解的特定内容?手动提及所有标签并提取是不可能的,对吗我不知道这是什么意思。正如Edward所说,向我们展示您实际想要做的事情—一个小样本,说明您想要处理的输入类型、您试图如何处理它、您得到的结果以及您需要的结果。@Edward我已经发布了用于解析的python代码和xml文件。。您可以看到我提到的用于从该特定标记检索值的标记名host的代码。@keshlam我已经发布了您要求的所有内容。。!!提前谢谢你。。。!!我是个新手,对python不太熟悉。你能说得更具体一点吗。非常感谢@用户3332520具体关于什么?这是代码。运行它,可以看到它的输出,而输出正是您所要求的——提取所有元素的属性和值。如果您在Linux操作系统上,它应该已经作为一个包提供了,通常称为python lxml或python2 lxml之类的东西。如果你在Windows上,你可以从下载它,非常感谢。我做了一些更正,得到了我想要的东西@用户3332520,很高兴听到。如果这个答案帮助你,请考虑标记它接受和投票。
from lxml import etree
from StringIO import StringIO

xml = '''
<root>
  <element key='value'>text</element>
  <element>text</element>tail
  <empty-element xmlns="http://testns/" />
</root>
'''

context = etree.iterparse(StringIO(xml))
for action, elem in context:
    print("%s: %s (attribs: %r; text: %r)"
          % (action, elem.tag, elem.attrib, elem.text))