在元素的属性上保留前缀

时间:2012-07-03 00:27:49

标签: php xml xpath

我有以下代码来获取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 个答案:

答案 0 :(得分: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]);
}