简单的XML删除标记之间的字符串


Simple XML removing string between tags

我有包含XML的产品。我需要从XML中获取:描述、价格、重量等。当我使用SimpleXML打开XML并打印时,标记之间没有文本。这是我的XML

<product id="30" currency="PLN" code_producer="M-1100/21">
    <producer id="1282294004" name="MAT lingerie" />
    <category id="1214553882" xml:lang="pol" name="BIUSTONOSZE/Półusztywniane" />
    <unit id="0" xml:lang="pol" name="szt." />
    <series id="4" xml:lang="pol" name="Basic Collection" />
    <card url="http://b2b.tiffanie.pl/product-pol-30-Sofia-biustonosz-polusztywniany-M-1100-21.html" />
    <description>
        <name xml:lang="eng">Sofia biustonosz półusztywniany M-1100/21</name>
        <name xml:lang="pol">Sofia biustonosz półusztywniany M-1100/21</name>
        <version name="czarny">
            <name xml:lang="eng">Sofia biustonosz półusztywniany M-1100/21</name>
            <name xml:lang="pol">czarny</name>
        </version>
        <long_desc xml:lang="eng">
            <span style="font-family: Tahoma, Geneva, sans-serif; color: #3f3229;">Delikatny biustonosz dla kobiet które cenią sobie komfort i wygodę. Biustonosz typu soft o perfekcyjnej konstrukcji pozwala zebrać biust jednocześnie doskonale, utrzymać go na miejscu. Miseczki zdobione są subtelnym kwiatowym haftem. Model posiada regulowane, odpinane ramiączka.</span>
        </long_desc>
        <long_desc xml:lang="pol">
            <span style="font-family: Tahoma, Geneva, sans-serif; color: #3f3229;">Delikatny biustonosz dla kobiet które cenią sobie komfort i wygodę. Biustonosz typu soft o perfekcyjnej konstrukcji pozwala zebrać biust jednocześnie doskonale, utrzymać go na miejscu. Miseczki zdobione są subtelnym kwiatowym haftem. Model posiada regulowane, odpinane ramiączka.</span>
        </long_desc>
    </description>

打印结果

[description] => SimpleXMLElement Object
(
    [name] => Array
        (
            [0] => SimpleXMLElement Object
                (
                    [@attributes] => Array
                        (
                            [lang] => eng
                        )
                )
            [1] => SimpleXMLElement Object
                (
                    [@attributes] => Array
                        (
                            [lang] => pol
                        )
                )
        )
    [long_desc] => Array
        (
            [0] => SimpleXMLElement Object
                (
                    [@attributes] => Array
                        (
                            [lang] => eng
                        )
                )
            [1] => SimpleXMLElement Object
                (
                    [@attributes] => Array
                        (
                            [lang] => pol
                        )
                )
        )
)

如何使用SimpleXML读取标记之间的文本并保存到对象?

在XML的末尾缺少一个标记"</product>"。也许是在c&p

无论如何,我使用XMLReader的测试代码都非常完美,对我来说,这是读取XML的最简单方法。

<?php
$input = file_get_contents('http://set4812.pl/web/1.xml');
$input = str_replace(['<![CDATA[', ']]>'], '', $input);
$reader = new XMLReader();
$reader->xml($input);
$r = xmlToArray($reader);
print_r($r);
function xmlToArray(XMLReader $xml){ 
    $array = []; 
    $i = 0; 
    while($xml->read()){ 
        if ($xml->nodeType == XMLReader::END_ELEMENT) {
            break; 
        } 
        if ($xml->nodeType == XMLReader::ELEMENT && !$xml->isEmptyElement) { 
            unset($array[$i]);
            $array[$i]['name'] = $xml->name; 
            $array[$i]['values'] = xmlToArray($xml); 
            $array[$i]['attributes'] = getAttributesFromNode($xml);
            $i++; 
        } else if ($xml->isEmptyElement) { 
            $array[$i]['name'] = $xml->name; 
            $array[$i]['values'] = null; 
            $array[$i]['attributes'] = getAttributesFromNode($xml);
            $i++;
        } else if($xml->nodeType == XMLReader::TEXT) {
            $array[$i]['values'] = $xml->value; 
        }
    }
    return $array; 
}
function getAttributesFromNode(XMLReader $xml)
{
    if(!$xml->hasAttributes) {
        return null;
    }
    $attributes = [];
    while($xml->moveToNextAttribute()) {
        $attributes[$xml->name] = $xml->value; 
    }
    return $attributes;
}