Get Element value with minidom with Python

前端 未结 9 1978
悲&欢浪女
悲&欢浪女 2020-11-29 18:01

I am creating a GUI frontend for the Eve Online API in Python.

I have successfully pulled the XML data from their server.

I am trying to grab the value from

相关标签:
9条回答
  • 2020-11-29 18:24

    Here is a slightly modified answer of Henrik's for multiple nodes (ie. when getElementsByTagName returns more than one instance)

    images = xml.getElementsByTagName("imageUrl")
    for i in images:
        print " ".join(t.nodeValue for t in i.childNodes if t.nodeType == t.TEXT_NODE)
    
    0 讨论(0)
  • 2020-11-29 18:25

    Probably something like this if it's the text part you want...

    from xml.dom.minidom import parse
    dom = parse("C:\\eve.xml")
    name = dom.getElementsByTagName('name')
    
    print " ".join(t.nodeValue for t in name[0].childNodes if t.nodeType == t.TEXT_NODE)
    

    The text part of a node is considered a node in itself placed as a child-node of the one you asked for. Thus you will want to go through all its children and find all child nodes that are text nodes. A node can have several text nodes; eg.

    <name>
      blabla
      <somestuff>asdf</somestuff>
      znylpx
    </name>
    

    You want both 'blabla' and 'znylpx'; hence the " ".join(). You might want to replace the space with a newline or so, or perhaps by nothing.

    0 讨论(0)
  • 2020-11-29 18:28

    I know this question is pretty old now, but I thought you might have an easier time with ElementTree

    from xml.etree import ElementTree as ET
    import datetime
    
    f = ET.XML(data)
    
    for element in f:
        if element.tag == "currentTime":
            # Handle time data was pulled
            currentTime = datetime.datetime.strptime(element.text, "%Y-%m-%d %H:%M:%S")
        if element.tag == "cachedUntil":
            # Handle time until next allowed update
            cachedUntil = datetime.datetime.strptime(element.text, "%Y-%m-%d %H:%M:%S")
        if element.tag == "result":
            # Process list of skills
            pass
    

    I know that's not super specific, but I just discovered it, and so far it's a lot easier to get my head around than the minidom (since so many nodes are essentially white space).

    For instance, you have the tag name and the actual text together, just as you'd probably expect:

    >>> element[0]
    <Element currentTime at 40984d0>
    >>> element[0].tag
    'currentTime'
    >>> element[0].text
    '2010-04-12 02:45:45'e
    
    0 讨论(0)
  • 2020-11-29 18:35

    It's a tree, and there may be nested elements. Try:

    def innerText(self, sep=''):
        t = ""
        for curNode in self.childNodes:
            if (curNode.nodeType == Node.TEXT_NODE):
                t += sep + curNode.nodeValue
            elif (curNode.nodeType == Node.ELEMENT_NODE):
                t += sep + curNode.innerText(sep=sep)
        return t
    
    0 讨论(0)
  • 2020-11-29 18:40

    The above answer is correct, namely:

    name[0].firstChild.nodeValue
    

    However for me, like others, my value was further down the tree:

    name[0].firstChild.firstChild.nodeValue
    

    To find this I used the following:

    def scandown( elements, indent ):
        for el in elements:
            print("   " * indent + "nodeName: " + str(el.nodeName) )
            print("   " * indent + "nodeValue: " + str(el.nodeValue) )
            print("   " * indent + "childNodes: " + str(el.childNodes) )
            scandown(el.childNodes, indent + 1)
    
    scandown( doc.getElementsByTagName('text'), 0 )
    

    Running this for my simple SVG file created with Inkscape this gave me:

    nodeName: text
    nodeValue: None
    childNodes: [<DOM Element: tspan at 0x10392c6d0>]
       nodeName: tspan
       nodeValue: None
       childNodes: [<DOM Text node "'MY STRING'">]
          nodeName: #text
          nodeValue: MY STRING
          childNodes: ()
    nodeName: text
    nodeValue: None
    childNodes: [<DOM Element: tspan at 0x10392c800>]
       nodeName: tspan
       nodeValue: None
       childNodes: [<DOM Text node "'MY WORDS'">]
          nodeName: #text
          nodeValue: MY WORDS
          childNodes: ()
    

    I used xml.dom.minidom, the various fields are explained on this page, MiniDom Python.

    0 讨论(0)
  • 2020-11-29 18:40

    The question has been answered, my contribution consists in clarifying one thing that may confuse beginners:

    Some of the suggested and correct answers used firstChild.data and others used firstChild.nodeValue instead. In case you are wondering what is the different between them, you should remember they do the same thing because nodeValue is just an alias for data.

    The reference to my statement can be found as a comment on the source code of minidom:

    #nodeValue is an alias for data

    0 讨论(0)
提交回复
热议问题