2015-03-06 10 views
0

Можно ли запросить несколько атрибутов из XML-узла с помощью XPath? Специально от sub-nodes? , например.XPath: запрос нескольких атрибутов

<outer> 
    <inner attr1="value1" attr2="value2"> 
     <leaf attr3="value3" /> 
    </inner> 
    <inner attr1="value1Inner1" attr2="valueInner12"> 
     <leaf attr3="value_leaf2" /> 
    </inner> 
</outer> 

Я хочу, чтобы получить что-то вроде

[ 
    ["value1", "value2", "value3"], 
    ["value1Inner1", "valueInner12", value_leaf2"] 
] 
+0

Возможный дубликат [Найти имена атрибутов, начинающиеся с определенного шаблона] (http://stackoverflow.com/questions/4150510/find-attribute-names-that-start-with-a-certain-pattern) – Stephan

ответ

1

Да, атрибуты только узлы. Но он не может получить вложенные списки узлов. Поэтому для желаемого результата вам нужно сначала выбрать элементы inner. Итерации их и получить все атрибут от них и их потомков.

Извлечь внутреннюю? узлы элементов:

/outer/inner

И атрибуты контекстного узла и его потомки:

descendant-or-self::*/@*

Демо:

$xml = <<<'XML' 
<outer> 
    <inner attr1="value1" attr2="value2"> 
     <leaf attr3="value3" /> 
    </inner> 
    <inner attr1="value1Inner1" attr2="valueInner12"> 
     <leaf attr3="value_leaf2" /> 
    </inner> 
</outer> 
XML; 

$dom = new DOMDocument(); 
$dom->loadXml($xml); 
$xpath = new DOMXPath($dom); 

foreach ($xpath->evaluate('/outer/inner') as $inner) { 
    $attributes = array_map(
    function (DOMAttr $node) { 
     return $node->value; 
    }, 
    iterator_to_array(
     $xpath->evaluate('descendant-or-self::*/@*', $inner) 
    ) 
); 
    var_dump($attributes); 
} 

Выход:

array(3) { 
    [0]=> 
    string(6) "value1" 
    [1]=> 
    string(6) "value2" 
    [2]=> 
    string(6) "value3" 
} 
array(3) { 
    [0]=> 
    string(12) "value1Inner1" 
    [1]=> 
    string(12) "valueInner12" 
    [2]=> 
    string(11) "value_leaf2" 
} 
0

Попробуйте этот запрос:

//*/@*[starts-with(name(), 'attr')] 

Этот запрос соответствует любому узлу, который имеет atribute начиная с attr.

DEMO

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