Oc-windows.ru

IT Новости из мира ПК
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Attributes xml php

SimpleXMLElement::attributes

SimpleXMLElement::attributes — Возвращает атрибуты элемента

Описание

Эта функция возвращает названия и значения атрибутов, определенные в теге XML.

Замечание: SimpleXML содержит правило добавления итеративных свойств к большинству методов. Они не могут быть просмотрены с использованием var_dump() или каких-либо других средств анализа объектов.

Список параметров

Необязательное пространство имен для извлеченных атрибутов

По умолчанию FALSE

Возвращаемые значения

Возвращает итерируемый объект SimpleXMLElement, по которому можно перемещаться для перебора всех атрибутов тега.

Возвращает NULL , если вызванный объект SimpleXMLElement уже представляет атрибут, а не тег.

Примеры

Пример #1 Интерпретация XML-строки

$xml = simplexml_load_string ( $string );
foreach( $xml -> foo [ 0 ]-> attributes () as $a => $b ) <
echo $a , ‘=»‘ , $b , «»n» ;
>
?>

Результат выполнения данного примера:

Смотрите также

User Contributed Notes 15 notes

It is really simple to access attributes using array form. However, you must convert them to strings or ints if you plan on passing the values to functions.

(
[@ attributes ] => Array
(
[ id ] => 55555
)

[ text ] => «hello world»
)
?>

Then using a function

function xml_attribute ( $object , $attribute )
<
if(isset( $object [ $attribute ]))
return (string) $object [ $attribute ];
>
?>

I can get the «id» like this

print xml_attribute ( $xml , ‘id’ ); //prints «55555»
?>

Note that you must provide the namespace if you want to access an attribute of a non-default namespace:

Consider the following example:

$sxml = new SimpleXMLElement ( $xml );

/**
* Access attribute of default namespace
*/
var_dump ((string) $sxml -> Table [ 0 ][ ‘Foo’ ]);
// outputs: ‘Bar’

/**
* Access attribute of non-default namespace
*/
var_dump ((int) $sxml -> Table [ 0 ][ ‘ExpandedColumnCount’ ]);
// outputs: 0

var_dump ((int) $sxml -> Table [ 0 ]-> attributes ( ‘ss’ , TRUE )-> ExpandedColumnCount );
// outputs: ‘7’
?>

// You can access an element’s attribute just like this :
$attribute = $element -> attributes ()-> $att ;

// This will save the value of the attribute, and not the objet
$attribute = (string) $element -> attributes ()-> $att ;

// You also can edit it this way :
$element -> attributes ()-> $att = ‘New value of the attribute’ ;
?>

Tip to get a real array of all attributes of a node (not SimpleXML’s object acting like an array)

//- $node is a SimpleXMLElement object

$atts_object = $node -> attributes (); //- get all attributes, this is not a real array
$atts_array = (array) $atts_object ; //- typecast to an array

//- grab the value of ‘@attributes’ key, which contains the array your after
$atts_array = $atts_array [ ‘@attributes’ ];

var_dump ( $atts_object ); //- outputs object(SimpleXMLElement)[19]
//- public ‘@attributes’ => .

var_dump ( $atts_array ); //- outputs array (size=11) .

?>
Hope this helps!

Use attributes to display when it meets certain condition defined attribute / value in xml tags.

Use atributos para exibir quando atende determinada condição definida atributo / valor em tags XML.

Consider the following example:
Considere o seguinte exemplo:

Checks if the attribute value equals «Language», if equal prints everything that is related to «Language».

Verifica se o valor do atributo é igual a «Language», se for, imprime tudo o que for relativo ao mesmo.

foreach( $xml -> children () as $child ) <

$role = $child -> attributes ();

foreach( $child as $key => $value ) <

if( $role == «Language» )
echo( «[» . $key . «] » . $value . «
» );

[name] PHP
[link] www.php.net

Easiest and safest way to get attributes as an array is to use the iterator_to_array function (see http://php.net/manual/en/function.iterator-to-array.php):

An undocumented way — and, IMO, a hack — of getting an element’s value OR attributes
(but not both) without type-casting is to use the function `current()`:

var_dump ([
‘bar’ => [
$xml -> bar ,
current ( $xml -> bar ),
],
‘baz’ => [
$xml -> baz -> attributes (),
current ( $xml -> baz -> attributes ()),
],
‘qux’ => [
// won’t work here correctly
$xml -> qux ,
current ( $xml -> qux ),
$xml -> qux -> attributes (),
current ( $xml -> qux -> attributes ()),
],
]);
?>

Results in the following output (re-formatted to shorten it):
«`
array(3) <
‘bar’ => array(2) <
[0] => class SimpleXMLElement#2 (1) <
public $ <0>=> string(1) «1»
>
[1] => string(1) «1»
>
‘baz’ => array(2) <
[0] => class SimpleXMLElement#5 (1) <
public $@attributes => array(1) <
.
>
>
[1] => array(1) <
‘name’ => string(3) «baz»
>
>
‘qux’ => array(4) <
[0] => class SimpleXMLElement#6 (2) <
public $@attributes => array(1) <
.
>
public $ <0>=> string(1) «3»
>
[1] => array(1) <
‘name’ => string(3) «qux»
>
[2] => class SimpleXMLElement#7 (1) <
public $@attributes => array(1) <
.
>
>
[3] => array(1) <
‘name’ => string(3) «qux»
>
>
>
«`

Читать еще:  Показать ошибки в тексте

This apparently reads the element as an array and just returns the value of the first property, whether it be the attributes or the value. As seen in the third example, this is unreliable, especially if you’re parsing XML from an outside source that may or may not have attributes on an element that you want the value of.

I certainly do NOT advise anyone to use this since it is undocumented and it is just a coincidence that it works, so it might break in the future without prior notice.

If you want to save the value of an attribute into an array, typecast it to a string.

// stores an xml-element-object
$dataStore [ ‘value’ ] = $attributes -> myValue

// stores the value of the attribute
$dataStore [ ‘value’ ] = (string) $attributes -> myValue
?>

So lets say you have database type data in an XML string called $xmlstring with the key or item ID as an XML Attribute and all content data as regular XML Elements, as above. SimpleXML processes the Attributes as an array, so we can play along and push the Attributes into an array. Then we can get the value of any specific Attribute we want by addressing it by name, such as «ID».

Considering this data:

Example of listing both the ID Attribute and Company Element values:

= new SimpleXMLElement ( $xmlstring );
foreach ( $xmlObject -> children () as $node ) <
$arr = $node -> attributes (); // returns an array
print ( » > . $arr [ «ID» ]); // get the value of this attribute
print ( » Company=» . $node -> Company );
print ( «

Работа с XML в PHP

Парсинг сайтов

Сейчас мы с вами изучим работу с XML. XML — это формат для обмена данными между сайтами. Он очень похож на HTML, только в XML разрешены свои теги и атрибуты.

Зачем нужен XML при парсинге? Иногда бывает так, что сайт, который вам нужно спарсить, имеет API, с помощью которого можно получить желаемое, особо не напрягаясь. Поэтому сразу совет — перед тем, как парсить сайт, проверьте, нету ли у него API.

Что такое API? Это набор функций, с помощью которых вы можете слать запрос этому сайту и получать нужный ответ. Вот этот ответ чаще всего приходит в формате XML. Поэтому давайте приступим к его изучению.

Работа с XML в PHP

Пусть у вас есть XML. Он может быть в строке, либо хранится в файле или отдаваться по запросу к определенному URL.

Пусть XML хранится в строке. В этом случае из этой строки нужно создать объект с помощью new SimpleXMLElement:

Сейчас у нас в переменной $xml хранится объект с разобранным XML. Обращаясь к свойствам этого объекта можно получать доступ с содержимому тегов XML. Как именно — разберем чуть ниже.

Если же XML хранится в файле или отдается по обращению к URL (что чаще всего и бывает), то следует использовать функцию simplexml_load_file, которая делает тот же объект $xml:

Приемы работы

В примерах ниже наш XML хранится в файле или по URL.

Пусть дан следующий XML:

Давайте получим имя, возраст и зарплату работника:

Как вы видите, у объекта $xml есть свойства, соответствующие тегам.

Вы может обратили внимание, что тег нигде не фигурирует при обращении. Это потому, что он корневой тег. Можно переименовать его, например, на — и ничего не поменяется:

Корневой тег в XML может быть только один, так же, как и тег в обычном HTML.

Давайте чуть модифицируем наш XML:

В этом случае у нас получится цепочка обращений:

Работа с атрибутами

Пусть некоторые данные хранятся в атрибутах:

Теги с дефисами

В XML разрешены теги (и атрибуты) с дефисом. В этом случае обращение к таким тегам происходит так:

Перебор циклом

Пусть теперь у нас не один работник, а несколько. В этом случае мы можем перебрать наш объект с помощью цикла foreach:

Из объекта в нормальный массив

Если вам неудобно работать с объектом, вы можете преобразовать его в нормальный массив PHP с помощью следующего хитрого приема:

Больше информации

Парсинг на основе sitemap.xml

Зачастую на сайте есть файл sitemap.xml. В этом файле хранятся ссылки на все страницы сайта для удобства индексации их поисковыми системами (индексация — это по сути и есть парсинг сайта яндексом и гуглом).

Читать еще:  Php json to csv

В общем-то нас мало должно волновать, зачем нужен этот файл, главное, что если он есть — можно не лазить по страницам сайта какими-либо хитрыми методами, а просто воспользоваться этим файлом.

Как проверить наличие этого файла: пусть мы парсим сайт site.ru, тогда обратитесь в браузере к site.ru/sitemap.xml — если что-то увидите, значит он там есть, а если не увидите — то увы.

Если sitemap есть — то в нем содежатся ссылки на все страницы сайта в формате XML. Спокойно забираете этот XML, парсите его, отделяете ссылки на нужные вам страницы любым удобным вам способом (например, анализом URL, который был описан в методе паука).

В итоге вы получаете список ссылок для парсинга, остается только зайти на них и спарсить нужным вам контент.

Подробнее об устройстве sitemap.xml читайте в википедии.

Что вам делать дальше:

Приступайте к решению задач по следующей ссылке: задачи к уроку.

Когда все решите — переходите к изучению новой темы.

SimpleXMLElement::attributes

(PHP 5 >= 5.0.1, PHP 7)

SimpleXMLElement::attributes — Возвращает атрибуты элемента

Описание

Эта функция возвращает названия и значения атрибутов установленные в xml теге.

Замечание: SimpleXML содержит правило добавления итеративных свойств к большинству методов. Они не могут быть просмотрены с использованием var_dump() или каких-либо других средств анализа объектов.

Список параметров

Не обязательное пространство имен для извлеченных атрибутов

По умолчанию FALSE

Возвращаемые значения

Возвращает итеративный объект SimpleXMLElement, по которому можно перемещаться для перебора всех атрибутов тега.

Вернет NULL если вызванный объект SimpleXMLElement уже представляет собой атрибуты, а не тег.

Примеры

Пример #1 Интерпретация XML строки

$xml = simplexml_load_string ( $string );
foreach( $xml -> foo [ 0 ]-> attributes () as $a => $b ) <
echo $a , ‘=»‘ , $b , «»n» ;
>
?>

Результат выполнения данного примера:

Смотрите также

Коментарии

here’s a simple function to get an attribute by name, based on the example

function findAttribute ( $object , $attribute ) <
foreach( $object -> attributes () as $a => $b ) <
if ( $a == $attribute ) <
$return = $b ;
>
>
if( $return ) <
return $return ;
>
>
?>

You can also access the node as an array to get attributes:

echo ‘Attribute: ‘ . $xml [ ‘attribute’ ];

It is really simple to access attributes using array form. However, you must convert them to strings or ints if you plan on passing the values to functions.

(
[@ attributes ] => Array
(
[ id ] => 55555
)

[ text ] => «hello world»
)
?>

Then using a function

function xml_attribute ( $object , $attribute )
<
if(isset( $object [ $attribute ]))
return (string) $object [ $attribute ];
>
?>

I can get the «id» like this

print xml_attribute ( $xml , ‘id’ ); //prints «55555»
?>

So lets say you have database type data in an XML string called $xmlstring with the key or item ID as an XML Attribute and all content data as regular XML Elements, as above. SimpleXML processes the Attributes as an array, so we can play along and push the Attributes into an array. Then we can get the value of any specific Attribute we want by addressing it by name, such as «ID».

Considering this data:

= «1.0» encoding = «utf-8» ?>

Navarro Corp.

Performant Systems

Digital Showcase

Example of listing both the ID Attribute and Company Element values:

= new SimpleXMLElement ( $xmlstring );
foreach ( $xmlObject -> children () as $node ) <
$arr = $node -> attributes (); // returns an array
print ( » > . $arr [ «ID» ]); // get the value of this attribute
print ( » Company=» . $node -> Company );
print ( «

If you want to save the value of an attribute into an array, typecast it to a string.

// stores an xml-element-object
$dataStore [ ‘value’ ] = $attributes -> myValue

// stores the value of the attribute
$dataStore [ ‘value’ ] = (string) $attributes -> myValue
?>

// You can access an element’s attribute just like this :
$attribute = $element -> attributes ()-> $att ;

// This will save the value of the attribute, and not the objet
$attribute = (string) $element -> attributes ()-> $att ;

// You also can edit it this way :
$element -> attributes ()-> $att = ‘New value of the attribute’ ;
?>

Reading the attributes of the root element with name space prefixes as in an Atom feed

Читать еще:  Как исправить ошибку 0x000007b

= @ simplexml_load_file ( $feed );
$att_gd = $xml -> attributes ( «gd» , 1 );
$Etag = $att_gd [ «etag» ];
?>

Note that you must provide the namespace if you want to access an attribute of a non-default namespace:

Consider the following example:

$sxml = new SimpleXMLElement ( $xml );

/**
* Access attribute of default namespace
*/
var_dump ((string) $sxml -> Table [ 0 ][ ‘Foo’ ]);
// outputs: ‘Bar’

/**
* Access attribute of non-default namespace
*/
var_dump ((int) $sxml -> Table [ 0 ][ ‘ExpandedColumnCount’ ]);
// outputs: 0

var_dump ((int) $sxml -> Table [ 0 ]-> attributes ( ‘ss’ , TRUE )-> ExpandedColumnCount );
// outputs: ‘7’
?>

Tip to get a real array of all attributes of a node (not SimpleXML’s object acting like an array)

//- $node is a SimpleXMLElement object

$atts_object = $node -> attributes (); //- get all attributes, this is not a real array
$atts_array = (array) $atts_object ; //- typecast to an array

//- grab the value of ‘@attributes’ key, which contains the array your after
$atts_array = $atts_array [ ‘@attributes’ ];

var_dump ( $atts_object ); //- outputs object(SimpleXMLElement)[19]
//- public ‘@attributes’ => .

var_dump ( $atts_array ); //- outputs array (size=11) .

?>
Hope this helps!

in order to get a possibly present xml:space attribute, use the following construct:

-> element -> attributes ( ‘http://www.w3.org/XML/1998/namespace’ )-> space ;
?>

This will, for example, return ‘preserve’ if set.

Just passing by ‘xml’ as namespace argument of the attribute() method didn’t work out for me. Passing by the complete namespace URI works also if it is not explicitly defined in the underlying XML document.

Also, $simpleXmlElement->getNamespaces() does not return anything of use.

Use attributes to display when it meets certain condition defined attribute / value in xml tags.

Use atributos para exibir quando atende determinada condição definida atributo / valor em tags XML.

Consider the following example:
Considere o seguinte exemplo:

Checks if the attribute value equals «Language», if equal prints everything that is related to «Language».

Verifica se o valor do atributo é igual a «Language», se for, imprime tudo o que for relativo ao mesmo.

foreach( $xml -> children () as $child ) <

$role = $child -> attributes ();

foreach( $child as $key => $value ) <

if( $role == «Language» )
echo( «[» . $key . «] » . $value . «
» );

[name] PHP
[link] www.php.net

If you wish to get attributes as an associative array of key value pairs, you don’t need to iterate through them, you can get it with this one liner:

Easiest and safest way to get attributes as an array is to use the iterator_to_array function (see function.iterator-to-array):

An undocumented way — and, IMO, a hack — of getting an element’s value OR attributes
(but not both) without type-casting is to use the function `current()`:

= new SimpleXMLElement ( ‘XML’
foo >
bar > 1 bar >
baz name = «baz» />
qux name = «qux» > 3 qux >
foo >
XML
);

var_dump ([
‘bar’ => [
$xml -> bar ,
current ( $xml -> bar ),
],
‘baz’ => [
$xml -> baz -> attributes (),
current ( $xml -> baz -> attributes ()),
],
‘qux’ => [
// won’t work here correctly
$xml -> qux ,
current ( $xml -> qux ),
$xml -> qux -> attributes (),
current ( $xml -> qux -> attributes ()),
],
]);
?>

Results in the following output (re-formatted to shorten it):
«`
array(3) <
‘bar’ => array(2) <
[0] => class SimpleXMLElement#2 (1) <
public $ <0>=> string(1) «1»
>
[1] => string(1) «1»
>
‘baz’ => array(2) <
[0] => class SimpleXMLElement#5 (1) <
public $@attributes => array(1) <
.
>
>
[1] => array(1) <
‘name’ => string(3) «baz»
>
>
‘qux’ => array(4) <
[0] => class SimpleXMLElement#6 (2) <
public $@attributes => array(1) <
.
>
public $ <0>=> string(1) «3»
>
[1] => array(1) <
‘name’ => string(3) «qux»
>
[2] => class SimpleXMLElement#7 (1) <
public $@attributes => array(1) <
.
>
>
[3] => array(1) <
‘name’ => string(3) «qux»
>
>
>
«`

This apparently reads the element as an array and just returns the value of the first property, whether it be the attributes or the value. As seen in the third example, this is unreliable, especially if you’re parsing XML from an outside source that may or may not have attributes on an element that you want the value of.

I certainly do NOT advise anyone to use this since it is undocumented and it is just a coincidence that it works, so it might break in the future without prior notice.

Ссылка на основную публикацию
Adblock
detector