XML валидатор

Тема в разделе "PHP", создана пользователем bvb, 27 янв 2010.

Статус темы:
Закрыта.
Модераторы: latteo
  1. bvb

    bvb

    Регистр.:
    17 май 2009
    Сообщения:
    189
    Симпатии:
    34
    Есть файл формата основанного на xml. Как его проверить на валидность?
     
  2. Alternator

    Alternator

    Регистр.:
    23 мар 2009
    Сообщения:
    295
    Симпатии:
    145
    PHP:
    $doc = new DOMDocument();
    $doc->load('book.xml');
    все ошибки XML будут выведены в виде warning-ов
    помимо этого естькуча софта, он-лайн и десктопных валидаторов
    http://www.stg.brown.edu/service/xmlvalid/
    Перейти по ссылке
    Перейти по ссылке
     
  3. bvb

    bvb

    Регистр.:
    17 май 2009
    Сообщения:
    189
    Симпатии:
    34
    Alternator, мне нужен скрипт на PHP и достаточно, чтобы он возвращал 1 если документ валиден.
     
  4. Alternator

    Alternator

    Регистр.:
    23 мар 2009
    Сообщения:
    295
    Симпатии:
    145
    PHP:
    function validate_ok($file_name)
        {
        
    $doc = new DOMDocument();
        
    $rand_name="validate_xml_".rand();
        
    $GLOBALS["\0".$rand_name]=true;
        
    set_error_handler(create_function('$errno,$errstr','$GLOBALS["\0'.$rand_name.'"]=false;'),E_WARNING);
        
    $doc->load($file_name);
        
    restore_error_handler();
        
    $ret=$GLOBALS["\0".$rand_name];
        unset(
    $GLOBALS["\0".$rand_name]);
        return 
    $ret;
        }
     
    bvb нравится это.
  5. bvb

    bvb

    Регистр.:
    17 май 2009
    Сообщения:
    189
    Симпатии:
    34
    Alternator, спасибо. Может быть еще объяснишь как получить аттрибуты определенного элемента?
     
  6. Alternator

    Alternator

    Регистр.:
    23 мар 2009
    Сообщения:
    295
    Симпатии:
    145
    мог бы и Перейти по ссылке почитать. там это достаточно хорошо описано.
    PHP:
    $doc = new DOMDocument();
    $doc->load($file_name);
    $elm=$doc->getElementById('id');//это лишь один из способов доступа к какому-то элементу.
    //помимо этого способов куча, в зависимости от того где сидит элемент, и какими свойствами обладает.надо смотреть конкретный XML-документ
    for($i=0;$i<$elm->attributes->length;$i++){//выводит все атрибуты
    echo $elm->attributes->item($i)->name.'=>'.$elm->attributes->item($i)->value.'<br/>';
    }
     
    bvb нравится это.
  7. Matinier

    Matinier Постоялец

    Регистр.:
    5 окт 2009
    Сообщения:
    65
    Симпатии:
    4
    Если PHP версии 5, то, по-моему, проще использовать SimpleXML.
    Им интуитивно понятнее разбирать документ по узлам.
    А функция, необходимая ТС, будет выглядеть так:

    PHP:
    function xmlValidate$filename ){

      
    $xml    simplexml_load_file$filename );

      return ( empty(
    $xml) ? $xml ); 
    }

    Если документ не валидный, то функция возвращает 0.
    Если валидный, то объект класса SimpleXMLElement, который можно разбирать по узлам.
     
    bvb нравится это.
  8. bvb

    bvb

    Регистр.:
    17 май 2009
    Сообщения:
    189
    Симпатии:
    34
    Возникла проблема - с большими файлами (порядка 65000 элементов в списке items) работает очень долго. Как быть?
    PHP:
    $items $doc->getElementsByTagName("tagname");
      for (
    $i 0$i $items->length$i++) {
        echo 
    $items->item($i)->getAttributeNode("attr")->nodeValue."\n";
        ...
      }
     
Статус темы:
Закрыта.