2013-05-19 4 views
4

То, что я пытаюсь сделать, - подсчитать элементы под корневым элементом. Затем проверьте, имеет ли один идентификатор на том же уровне значение id. Когда это происходит, он должен увеличиваться на единицу.Элементы подсчета XML, если id существует приращение на один

Код

public function _generate_id() 
{ 
    $id = 0; 
    $xpath = new DOMXPath($this->_dom); 
    do{ 
     $id++; 
    } while($xpath->query("/*/*[@id=$id]")); 

    return $id; 
} 

пример XML

<?xml version="1.0"?> 
<catalog> 
    <book id="0"> 
     <author>Gambardella, Matthew</author> 
     <title>XML Developer's Guide</title> 
     <genre>Computer</genre> 
     <price>44.95</price> 
     <publish_date>2000-10-01</publish_date> 
     <description>An in-depth look at creating applications 
      with XML.</description> 
    </book> 
    <book id="1"> 
     <author>Ralls, Kim</author> 
     <title>Midnight Rain</title> 
     <genre>Fantasy</genre> 
     <price>5.95</price> 
     <publish_date>2000-12-16</publish_date> 
     <description>A former architect battles corporate zombies, 
      an evil sorceress, and her own childhood to become queen 
      of the world.</description> 
    </book> 
</catalog> 
+0

Я использовал Гото заявление и увеличиваем идентификатор и, кажется, работает. Если у кого-то есть лучшее предложение. Я всегда за это. – Dany

+0

В чем вопрос? – hek2mgl

+0

Извините, я был настолько сосредоточен на том, чтобы сделать себя ясным. Ну, мне нужно знать мотыгу, чтобы считать элементы и увеличивать на единицу, если идентификатор уже занят. Таким образом, идентификатор должен быть уникальным. Мне все равно, как это делается: P – Dany

ответ

2

Вы можете использовать следующий XPATH запрос, чтобы получить максимальное значение атрибута ID:

$result = $xpath->query('/*/*[not(../*/@id > @id)]/@id'); 

В вашей функции вы можете вернуть это значение увеличивается на 1:

return intval($result->item(0)->nodeValue) + 1; 

Update: Вы можете сделать операцию инкремента с использованием XPath, а также. Примечание DOMXPath::evaluate():

return $xpath->evaluate('/*/*[not(../*/@id > @id)]/@id + 1'); 
                 |------- +1 in xpath 

Это даст вам 2 - но, как двойной. Я хотел бы предложить, чтобы преобразовать в целое перед возвратом результата:

return (integer) $xpath->evaluate('/*/*[not(../*/@id > @id)]/@id + 1'); 
+0

Это самый короткий код, и он выводит то, что я хочу. Вот почему это исключенный ответ. Спасибо всем за ваше время! – Dany

+0

... и это * pure * xpath solution;) – hek2mgl

+0

@hakre :) Да, я тоже подумал: операция '+ 1' может быть выполнена с помощью xpath, а также не было времени до сих пор, будет обновлено сообщение, когда у меня есть ... – hek2mgl

1

Я предлагаю вам создать массив из всех существующих значений ID первых (что один запрос XPath), а затем вы проверяете против него:

$id = 0; 
while(isset($ids[$id])) { 
    $id++; 
} 

echo $id; # 2 

Создание такого списка тривиальна запуска на XPath SimpleXML, однако это может быть легко перенесен на DOMXPath, а также с iterator_to_array:

<?php 
$buffer = <<<BUFFER 
<?xml version="1.0"?> 
<catalog> 
    <book id="0"> 
     <author>Gambardella, Matthew</author> 
     <title>XML Developer's Guide</title> 
     <genre>Computer</genre> 
     <price>44.95</price> 
     <publish_date>2000-10-01</publish_date> 
     <description>An in-depth look at creating applications 
      with XML.</description> 
    </book> 
    <book id="1"> 
     <author>Ralls, Kim</author> 
     <title>Midnight Rain</title> 
     <genre>Fantasy</genre> 
     <price>5.95</price> 
     <publish_date>2000-12-16</publish_date> 
     <description>A former architect battles corporate zombies, 
      an evil sorceress, and her own childhood to become queen 
      of the world.</description> 
    </book> 
</catalog> 
BUFFER; 

$xml = simplexml_load_string($buffer); 
$ids = array_flip(array_map('intval', $xml->xpath("/*/*/@id"))); 

Interactive Demo

Кроме того, я предлагаю вам не использовать 0 (ноль) в качестве значения ID.

1

Использование SimpleXML, попробуйте этот

$xml = simplexml_load_string($this->_dom); 
$id = is_array($xml->book) ? $xml->book[count($xml->book)-1]->attributes()->id : 0; 

return $id; 
Смежные вопросы