2012-07-03 2 views
2

У меня есть следующий код для захвата атрибутов элемента RichText. Атрибуты имеют либо префикс, как s7:, либо нет префикса.сохранить префикс атрибутов элемента

<?php 
$url = "http://testvipd7.scene7.com/is/agm/papermusepress/HOL_12_F_green?&fmt=fxgraw";  
$xml = simplexml_load_file($url);  
$xml->registerXPathNamespace('default', 'http://ns.adobe.com/fxg/2008'); 
$xml->registerXPathNamespace('s7', 'http://ns.adobe.com/S7FXG/2008'); 
$textNode = $xml->xpath("//default:RichText[@s7:elementID]"); 

function pr($var) { print '<pre>'; print_r($var); print '</pre>'; } 

$result1 = array(); 
$result2 = array(); 
foreach($textNode as $node){ 
    $result1[] = $node->attributes('http://ns.adobe.com/S7FXG/2008'); 
    $result2[] = $node->attributes(); 

} 

$text = array_merge($result1,$result2); 

pr($text); 

?> 

ВЫВОД

Array 
(
    [0] => SimpleXMLElement Object 
     (
      [@attributes] => Array 
       (
        [caps] => none 
        [colorName] => 
        [colorValue] => #518269 
        [colorspace] => rgb 
        [elementID] => smalltext 
        [fill] => true 
        [fillOverprint] => false 
        [firstBaselineOffset] => ascent 
        [joints] => miter 
        [maxFontSize] => 11 
        [miterLimit] => 4 
        [referencePoint] => inherit 
        [rowCount] => 1 
        [rowGap] => 18 
        [rowMajorOrder] => true 
        [stroke] => false 
        [strokeOverprint] => false 
        [warpBend] => 0.5 
        [warpDirection] => horizontal 
        [warpHorizontalDistortion] => 0 
        [warpStyle] => none 
        [warpVerticalDistortion] => 0 
        [weight] => 1 
       ) 

     ) 

    [1] => SimpleXMLElement Object 
     (
      [@attributes] => Array 
       (
        [caps] => none 
        [colorName] => 
        [colorValue] => #518269 
        [colorspace] => rgb 
        [elementID] => largetext 
        [fill] => true 
        [fillOverprint] => false 
        [firstBaselineOffset] => ascent 
        [joints] => miter 
        [maxFontSize] => 19 
        [miterLimit] => 4 
        [referencePoint] => inherit 
        [rowCount] => 1 
        [rowGap] => 18 
        [rowMajorOrder] => true 
        [stroke] => false 
        [strokeOverprint] => false 
        [warpBend] => 0.5 
        [warpDirection] => horizontal 
        [warpHorizontalDistortion] => 0 
        [warpStyle] => none 
        [warpVerticalDistortion] => 0 
        [weight] => 1 
       ) 

     ) 

    [2] => SimpleXMLElement Object 
     (
      [@attributes] => Array 
       (
        [x] => 278.418 
        [y] => 115.542 
        [columnGap] => 18 
        [columnCount] => 1 
        [textAlign] => left 
        [fontFamily] => Trade Gothic LT Pro Bold Cn 
        [fontSize] => 11 
        [color] => #518269 
        [whiteSpaceCollapse] => preserve 
        [width] => 212.582 
        [height] => 33 
       ) 

     ) 

    [3] => SimpleXMLElement Object 
     (
      [@attributes] => Array 
       (
        [x] => 278.998 
        [y] => 86.7168 
        [columnGap] => 18 
        [columnCount] => 1 
        [textAlign] => left 
        [fontFamily] => Bootstrap 
        [fontSize] => 19 
        [color] => #518269 
        [whiteSpaceCollapse] => preserve 
        [trackingRight] => 4% 
        [width] => 240 
        [height] => 29 
       ) 

     ) 

) 

Все атрибуты, собранные в $result1[] являются те, которые должны иметь префикс s7:. Но когда он хранит данные из xml, он лишает s7: этих атрибутов. Вы можете видеть это, поскольку значения массива для ключей 0 и 1 удаляют префикс. Мне нужен префикс, чтобы остаться там, так что это будет выглядеть следующим образом:

[s7:caps] => none 
[s7:colorName] => 
[s7:colorValue] => #518269 
[s7:colorspace] => rgb 
[s7:elementID] => smalltext 

etc... 

Как я могу предотвратить префикс раздевание, или как я могу добавить его обратно туда, когда массив становится построен?

ответ

1

Не знаете, почему PHP исключает пространство имен извлечения - возможно, кто-то более осведомленный в libxml может помочь в этом, но переименование их после извлечения достаточно просто.

//some sample XML - get the attributes 
$xml = "<root name='root'><node id='1'>hello</node></root>"; 
$doc = new SimpleXMLElement($xml); 
$attrs = $doc->xpath('//@*'); 

//iterate over array and add in namespace prefixes  
foreach($attrs as $key => $val) { 
    $attrs['s7:'.$key] = $val; 
    unset($attrs[$key]); 
} 
Смежные вопросы