2015-06-22 4 views
0

Может кто-нибудь сказать мне причину провала этого XPATH запроса:XPath-запрос, кажется, терпит неудачу

//Pages/*[(name() = 'Home') or following-sibling::Home] 

на этой XML-структуры:

<Pages> 
    <copyright>me inc. 2015,</copyright> 
    <author>Me</author> 
    <lastUpdate>2/1/1999</lastUpdate> 

    <Home>--------------------</Home> 
    <About>--------------------</About> 
    <Contact>------------------</Contact> 
</Pages> 

только возвращенного авторского элемента, который против моих целей (Чтобы захватить весь элемент между страницами и домом. это: авторское право, автор, lastUpdate и весь дом). или я делаю это неправильно?

public function fetchAsArray($pathToRecord, $conversionOption = array()) { 
 
    if($pathToRecord == null){ 
 
     $this->Err['code'] = ERR_EMPTY_XPATH_QUERY;  
 
     $this->Err['msg'] = " Specified path to an xml file is non-existent "; 
 
      return false; 
 
    } 
 
     
 
    $xml = simplexml_import_dom($this->xmlObj); 
 
    $result = $xml->xpath($pathToRecord);  //unknown node handle 
 
     
 
    if ($result === false) { 
 
     $this->parseError();     //To return xml Error code 
 
     return false ; 
 
    } 
 
     
 
    if (empty($result)) { 
 
     return NO_RECORD_FOUND; 
 
    } 
 

 
    return $this->strToArray($result[0]->saveXML());  //strToArray() is here: https://gist.github.com/laiello/8189351 
 
}

/* 
 
    inside myXMLManager::fetchAsArray(), i did this: 
 

 
    foreach($result as $val) {echo $xml->saveXML($val);} 
 
     
 
    returned Error was, Warning: SimpleXMLElement::saveXML(): failed to open stream: Invalid argument in 
 
    lib\myXMLManager.php on line 205. 
 

 
    next, changing $result to result[0] in the same foreach returned null. 
 
    lastly, just doing var_dump($result[0]); returned null, while 
 
    var_dump($result) returned: 
 
     
 
    array (size=4) 
 
    0 => 
 
    object(SimpleXMLElement)[8] 
 
    1 => 
 
    object(SimpleXMLElement)[9] 
 
    2 => 
 
    object(SimpleXMLElement)[10] 
 
    3 => 
 
    object(SimpleXMLElement)[11] 
 

 
    null 
 

 
     whats' wrong ? or could it be from the call to strToArray() henceforth ? 
 
*/​

+1

Как вы проверки повторно развернутый узел узлов? Какой двигатель XPathe вы используете? На моей стороне ваш запрос вернул имена 'copyright',' author', 'lastUpdate' и' Home' именно так, как ожидалось. (oh, и ваш запрос может быть немного короче: '// Страницы/* [self :: Home или следующий-sibling :: Home]') –

+2

Ваш XPath возвращает авторские права, автор, lastUpdate и Home: http: // www.utilities-online.info/xpath/?save=3dfef61e-3bfc-446d-b8ad-8712434a1d28-xpath – unutbu

+1

@OsagieOdigie Возможно, вы показываете код, чем в третий раз, создаете тот же вопрос. Этот путь в порядке, проблема в реализации – splash58

ответ

1
$str = '<root><Pages> 
    <copyright>me inc. 2015,</copyright> 
    <author>Me</author> 
    <lastUpdate>2/1/1999</lastUpdate> 

    <Home>--------------------</Home> 
    <About>--------------------</About> 
    <Contact>------------------</Contact> 
</Pages></root>'; 

$xml = simplexml_load_string($str); 
$result = $xml->xpath('//Pages/*[(name() = "Home") or following-sibling::Home]');   
    if ($result === false) { 
     $this->parseError();     //To return xml Error code 
     return false ; 
    } 

    if (empty($result)) { 
     return NO_RECORD_FOUND; 
    } 

    foreach($result as $r) echo $r->getName()."\n"; 

результат

copyright 
author 
lastUpdate 
Home 
+0

Я нашел проблему. произошла строка: return $ this-> strToArray ($ result [0] -> saveXML()); прошло me inc. 2015, для функции strToArray() и немедленно возвращается к вызывающему. так что funcftion strToArray() didint граничит с другим переданным в строке. я должен признать, что я глуп, и должен оценить вас за вашу помощь. Бог благословил. –

+0

Я рад, что вы нашли решение. Удачи! – splash58

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