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

时间:2013-11-26 20:02:06

标签: php xml

我有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>

print_r中的结果

[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在标签之间读取文本并保存到对象?

1 个答案:

答案 0 :(得分:1)

XML末尾缺少标记“</product>”。也许在c&amp; 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;
}