Getting the text portion of a node using php Simple XML

前端 未结 7 2007
臣服心动
臣服心动 2020-12-03 18:39

Given the php code:

$xml = <<
This is a link Title with some text following it.
相关标签:
7条回答
  • 2020-12-03 19:20

    This has already been answered, but CASTING TO STRING ( i.e. $sString = (string) oSimpleXMLNode->TagName) always worked for me.

    0 讨论(0)
  • 2020-12-03 19:29
    node->asXML();// It's the simple solution i think !!
    
    0 讨论(0)
  • 2020-12-03 19:36

    Try this:

    $parser = new SimpleXMLElement($xml);
    echo html_entity_decode(strip_tags($parser->asXML()));
    

    That's pretty much equivalent to:

    $parser = simplexml_load_string($xml);
    echo dom_import_simplexml($parser)->textContent;
    
    0 讨论(0)
  • 2020-12-03 19:38

    Like @tandu said, it's not possible, but if you can modify your XML, this will work:

    $xml = <<<EOF
    <articles>
        <article>
            This is a link
        </article>
        <link>Title</link>
        <article>
           with some text following it.
        </article>
    </articles>
    
    0 讨论(0)
  • 2020-12-03 19:41

    There might be ways to achieve what you want using only SimpleXML, but in this case, the simplest way to do it is to use DOM. The good news is if you're already using SimpleXML, you don't have to change anything as DOM and SimpleXML are basically interchangeable:

    // either
    $articles = simplexml_load_string($xml);
    echo dom_import_simplexml($articles)->textContent;
    
    // or
    $dom = new DOMDocument;
    $dom->loadXML($xml);
    echo $dom->documentElement->textContent;
    

    Assuming your task is to iterate over each <article/> and get its content, your code will look like

    $articles = simplexml_load_string($xml);
    foreach ($articles->article as $article)
    {
        $articleText = dom_import_simplexml($article)->textContent;
    }
    
    0 讨论(0)
  • 2020-12-03 19:41

    So, the simple answer to my question was: Simplexml can't process this kind of XML. Use DomDocument instead.

    This example shows how to traverse the entire XML. It seems that DomDocument will work with any XML whereas SimpleXML requires the XML to be simple.

    function attrs($list) {
        $result = "";
        foreach ($list as $attr) {
            $result .= " $attr->name='$attr->value'";
        }
        return $result;
    }
    
    function parseTree($xml) {
        $result = "";
        foreach ($xml->childNodes AS $item) {
            if ($item->nodeType == 1) {
                $result .= "<$item->nodeName" . attrs($item->attributes) . ">" . parseTree($item) . "</$item->nodeName>";
            }
            else {
                $result .= $item->nodeValue;
            }
        }
        return $result;
    }
    
    $xmlDoc = new DOMDocument();
    $xmlDoc->loadXML($xml);
    
    print parseTree($xmlDoc->documentElement);
    

    You could also load the xml using simpleXML and then convert it to DOM using dom_import_simplexml() as Josh said. This would be useful, if you are using simpleXml to filter nodes for parsing, e.g. using XPath.

    However, I don't actually use simpleXML, so for me that would be taking the long way around.

    $simpleXml = new SimpleXMLElement($xml);
    $xmlDom = dom_import_simplexml($simpleXml);
    
    print parseTree($xmlDom);
    

    Thank you for all the help!

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