2016-10-06 7 views
0

XMl, как показано ниже,удалить узел из `SimpleXMLElement Object`

<text font-family="Helvetica" font-size="25" style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 10; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" > 
    <tspan x="-100" y="7.87" style="stroke: none; stroke-width: 0; stroke-dasharray: none; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: ; opacity: 1;">t</tspan> 
    <tspan x="-93" y="7.87" style="stroke: none; stroke-width: 0; stroke-dasharray: none; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: ; opacity: 1;">e</tspan> 
    <tspan x="-79" y="7.87" style="stroke: none; stroke-width: 0; stroke-dasharray: none; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: ; opacity: 1;">s</tspan> 
    <tspan x="-66" y="7.87" style="stroke: none; stroke-width: 0; stroke-dasharray: none; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: ; opacity: 1;">t</tspan> 
</text> 

Что я хочу сделать, это, держать первый tspan и добавить все остальные tspan значение на первом tspan и удалить все остальные.

Он желаемый результат,

<text font-family="Helvetica" font-size="25" style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 10; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" > 
    <tspan x="-100" y="7.87" style="stroke: none; stroke-width: 0; stroke-dasharray: none; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: ; opacity: 1;">test</tspan> 
</text> 

Для этого, что я сделал,

$previousValue = null; 
$first = $text->tspan[0]; 
foreach($text->tspan as $k2=>$span){ 
       if(is_object($span)){ 
        $style = $span->attributes()->style; 
        if($previousValue) { 
         if(strcmp($style,$previousValue) === 0){ 
          $first.=$span; 
          //$dom=dom_import_simplexml($span); $dom->parentNode->removeChild($dom); 
         } 
        } 
        $previousValue = $style; 
       } 
      } 
      $text->tspan[0] = $first; 

Это создаст первый узел совершенны, но не удаляя другие узлы собственно. Я попытался это даже

$dom=dom_import_simplexml($span); $dom->parentNode->removeChild($dom); 

Но это только извлекая 1 узел и разорвать петлю затем. Не знаю, что там происходит. Я делаю там какую-то ошибку?

ответ

1

Использование SimpleXMLElement и XPath вы можете сделать это, как следующее:

$xml = new SimpleXMLElement($xmlString); 

$texts = $xml->xpath('//text/tspan/..'); 

foreach ($texts as $text) { 
    $tspans = $text->xpath('//tspan');; 

    $currentTspan = array_shift($tspans); 


    foreach ($tspans as $tspan) { 
     if ($currentTspan['style']->asXML() != $tspan['style']->asXML()) { 
      $currentTspan = $tspan; 
      continue; 
     } 

     $currentTspan[0] .= $tspan[0]; 

     unset($tspan[0]); 
    } 
} 

Here is working demo.

Я использовал array_shift() функцию здесь для простоты. Все, что он делает, возвращает первый элемент массива и удаляет его.

+0

Я использую этот ключ в foreach 'xmlobject' и выглядит как' tspans = $ xml-> xpath ('// tspan'); 'не работает там. Я только что добавил часть xml здесь. вы можете увидеть мой полный xml здесь. https://www.printhubpro.co.uk/images/export_edited.svg – hemsbhardiya

+0

и вот мой полный образец кода http://sandbox.onlinephpfunctions.com/code/5e80bf5d738cc65b6c145cb047b6f195a67364fe – hemsbhardiya

+0

спасибо за ответ, но все же его не работает согласно к моему xml. ты его видел? он имеет также тег 'g'. я знаю, что мы закрылись, и небольшая вещь заставит его работать. но я совершенно новый на xmlobject – hemsbhardiya

Смежные вопросы