Вот источник xml: xml
Это xml файла fxg, созданного Adobe. Документ FXG является действительным xml, и он в основном содержит всю информацию для документа, который можно редактировать. Этот конкретный вопрос относится к тексту, который может быть изменен в FXG, чтобы контент мог измениться.
Я пытаюсь захватить все элементы и атрибуты RichText внутри этого элемента, которые имеют атрибут s7:elementID
используя относительное местоположение xpath.
Исходный XML имеет только три общих элемента RichText
, причем только два из них имеют s7:elementID
<?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"); print("<pre>".print_r($textNode,true)."</pre>"); ?>
Я получил это с помощью другого вопроса. Но возвращенный массив – это не то, что я ожидал. установив xpath, как и я, я ожидаю, что он выберет все элементы RichText
, у которых есть s7:elementID
, а также другие атрибуты этого элемента. Однако он не захватывает никаких других атрибутов этих элементов. вот что он выводит:
Array ( [0] => SimpleXMLElement Object ( [@attributes] => Array ( [elementID] => smalltext ) ) [1] => SimpleXMLElement Object ( [@attributes] => Array ( [elementID] => largetext ) ) )
Если я возьму тот же самый php, но изменим xpath так:
$textNode = $xml->xpath("//default:RichText");
Я получаю этот результат массива:
Array ( [0] => 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 ) [content] => SimpleXMLElement Object ( [p] => Array ( [0] => SimpleXMLElement Object ( [span] => Scott, Anna, and Conner ) [1] => SimpleXMLElement Object ( [span] => and our little one on the way ) ) ) ) [1] => 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 ) [content] => SimpleXMLElement Object ( [p] => SimpleXMLElement Object ( [span] => THE JOHNSONS ) ) ) [2] => SimpleXMLElement Object ( [@attributes] => Array ( [x] => 278.418 [y] => 77.2373 [columnGap] => 0 [columnCount] => 1 [textAlign] => left [fontFamily] => Trade Gothic LT Pro Bold Cn [fontSize] => 11 [color] => #518269 [whiteSpaceCollapse] => preserve ) [content] => SimpleXMLElement Object ( [p] => SimpleXMLElement Object ( [span] => Array ( [0] => W [1] => ishing you the best this season. ) ) ) ) )
Если вы заметили, первые два элемента массива даже не имеют информации для s7:elementID
, но они оба должны. Третий не имеет s7:elementID
по дизайну.
Может ли кто-нибудь объяснить, почему я получаю эти неожиданные результаты массива, с некоторыми атрибутами, а другие нет?
ОБНОВИТЬ
Per dusan, я обновил php до:
$textNode = $xml->xpath("//default:RichText[@s7:elementID]");
Теперь массив возвращает только атрибуты элемента, у которого нет префикса. Мне нужны все атрибуты, префикс и нет.
Array ( [0] => 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 ) [content] => SimpleXMLElement Object ( [p] => Array ( [0] => SimpleXMLElement Object ( [span] => Scott, Anna, and Conner ) [1] => SimpleXMLElement Object ( [span] => and our little one on the way ) ) ) ) [1] => 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 ) [content] => SimpleXMLElement Object ( [p] => SimpleXMLElement Object ( [span] => THE JOHNSONS ) ) ) )
ОБНОВЛЕНИЕ 2
изменение php на это похоже на получение всех атрибутов, как по умолчанию, так и с префиксом 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]"); // //default:RichText[@s7:elementID]/@* function pr($var) { print '<pre>'; print_r($var); print '</pre>'; } foreach($textNode as $node){ pr($node->attributes('http://ns.adobe.com/S7FXG/2008')); pr($node->attributes()); } ?>
И результат XML:
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 ) ) 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 ) ) 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 ) ) 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 ) )
теперь, когда он способен извлекать все атрибуты элемента RichText
. Как я могу хранить определенные атрибуты в качестве определенной переменной? Например, как установить переменную для атрибутов s7:elementID
и fontSize
?