Intereting Posts
Как я могу перемещать объекты JS плавно с помощью ввода с клавиатуры? n-й нечетный / четный дочерний элемент h3 Rails 2 Mailer View Преrotation 3D в строки позиционирование всплывающих окон на частичных представлениях jQuery Автообновление div Свойство CSS-содержимого: возможно ли вставить HTML вместо текста? DIV Вертикальная полоса прокрутки слева Создание windows предупреждения jquery с текущим кодом foreach xml node возвращает выбранный элемент Сложность с переполнением выпадающего списка selectize.js на мобильных устройствах Как обеспечить CSS: зависание применяется к динамически добавленному элементу Как использовать javascript или jquery, чтобы проверить, существует ли именованное окно Как я могу предварительно заполнить поля ввода формы html из параметров url? Как преобразовать данные в формат CSV или HTML в iOS? Фиксированная позиция div с возможностью прокрутки

извлекать xml из xml, украшенного html

im пытается получить xml представленный здесь http://www.ncbi.nlm.nih.gov/sra/ERX086768?report=FullXml, но его немного сложно, потому что они не дают никакой поддержки для этого. objective состоит в том, чтобы получить xml для php, чтобы переделать xml.

может кто подскажет?

На самом деле не так, что XML, представленный через HTML, не будет также XML.

То, что вы ищете, называется textContent в DOMDocument . Это даст вам только текст из этого HMTL. Как и в браузере отображается «как текст».

Итак, все, что вам нужно сделать, – загрузить документ HTML в DOMDocument . Поскольку в нем содержатся ошибки, используется внутренняя ошибка:

 $url = 'http://www.ncbi.nlm.nih.gov/sra/ERX086768?report=FullXml'; $doc = new DOMDocument(); libxml_use_internal_errors(TRUE); $doc->loadHTMLFile($url); libxml_use_internal_errors(FALSE); 

Следующая часть подразумевает конкретные знания о том, что страница очищается. В вашем случае XML является указанным текстовым содержимым всех div-тегов с атрибутом classа «xml-tag» * после * после тега с идентификатором «ResultView» .

Эти tags можно легко получить с помощью запроса xpath, тогда их текстовое содержимое будет храниться в массиве:

 $xpath = new DOMXPath($doc); $nodes = $xpath->query('//*[@id="ResultView"]/following-sibling::div[@class="xml-tag"]'); $buffer = array(); foreach ($nodes as $node) { $buffer[] = $node->textContent; } 

Итак, теперь все, что нужно сделать, – создать новый DOMDocument и загрузить в него буфер XML, сделать несколько хороших форм и выход:

 $new = new DOMDocument(); $new->preserveWhiteSpace = FALSE; $new->formatOutput = TRUE; $new->loadXML(implode('', $buffer)); $new->save('php://output'); 

Эти примерно 20 строк кода производят следующий вывод:

     ERX086768 SC_EXP_7229_8#56     ERP000913 Genome_diversity_in_Streptococcus_dysgalactiae_subspecies_equisimilis-sc-2011-09-22T08:43:17Z-1977    Standard   ERS074283 MR223754-sc-2011-11-18T11:31:44Z-1306470    4008297 WGS GENOMIC RANDOM        0 Application Read Forward 1   1 Application Read Reverse        Illumina HiSeq 2000       ERA119046 ERP000913-sc-20120417-2     ERP000913 Genome_diversity_in_Streptococcus_dysgalactiae_subspecies_equisimilis-sc-2011-09-22T08:43:17Z-1977   Genome_diversity_in_Streptococcus_dysgalactiae_subspecies_equisimilis  http://www.sanger.ac.uk/resources/downloads/bacteria/ Genome_diversity_in_Streptococcus_dysgalactiae_subspecies_equisimilis http://www.sanger.ac.uk/resources/downloads/bacteria/ This data is part of a pre-publication release. For information on the proper use of pre-publication data shared by the Wellcome Trust Sanger Institute (including details of any publication moratoria), please see http://www.sanger.ac.uk/datasharing/     ERS074283 MR223754-sc-2011-11-18T11:31:44Z-1306470   Streptococcus dysgalactiae subspecies equisimilis 119602 Streptococcus dysgalactiae subsp. equisimilis     biosample 859730      Strain MR223754   Sample Description    ArrayExpress-StrainOrLine MR223754   ArrayExpress-Sex not applicable   ArrayExpress-Species Streptococcus dysgalactiae subspecies equisimilis       ERR109334 SC_RUN_7229_8#56    ERX086768 SC_EXP_7229_8#56         

Так что не изобретайте колесо, просто узнайте о существующих инструментах. Иногда это проще, чем кажется на первый взгляд.

http://php.net/manual/en/class.simplexmlelement.php

Это даст вам простой интерфейс для использования xml в качестве объекта. Вы можете установить некоторые атрибуты, чтобы анализировать значения и атрибуты cdata, которые я предполагаю. Чтобы получить xml с веб-сервера, используйте что-то вроде curl или file_get_contents. Но рекомендуется скручивание.

нажатие на send data> get приведет вас к другой странице. Параметры для загрузки в разных форматах. Этот URL-адрес: http://trace.ncbi.nlm.nih.gov/Traces/sra/?cmd=dload&run_list=ERR109334&format=fasta, как представляется, предоставляет данные в формате gzip. Возможно, вы можете использовать GET в этом источнике вместо того, чтобы пытаться разобрать XML из HTML?

Вам нужно будет составить список всех допустимых тегов HTMl и удалить их с веб-страницы. Например:

 $taglist = ['div', 'b', 'input']; // List the HTML tags here. $xml= (read in the webpage here); foreach ($taglist as $tag) { $regex = '<' . $tag . '(?: [az]+(?:=.+))*?>'; $xml = preg_replace($regex, '', $xml); // Repeat for the closing tag $regex = ''; $xml = preg_replace($regex, '', $xml); } 

После этого, $ xml будет содержать XML как строку, и PHP должен иметь возможность обрабатывать его.

этот class XmlRead может это сделать. я тоже ставлю class curl

свернуться:

  function HeaderProc($response,$Run="",$String=1/*[Is 1 IF Use for String Mode ]*/){ if($String==1){ $response=explode("\r\n",$response); } $PartHeader=0; $out[$PartHeader]=array(); while(list($key,$val)=each($response)){ $name=''; $value=''; $flag=false; for($i=0;$iCookie=array(); preg_match("~(.*?)=(.*?);~si",' '.$Cookie.'; ',$M); $this->Cookie[trim($M[1])]=trim($M[2]); return $this->Cookie; } function cURL($cookies=false,$cookie='cookies.txt',$compression='gzip',$proxy='') { $this->headers[] = 'Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'; $this->headers[] = 'Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3'; $this->headers[] = 'Accept-Encoding:gzip,deflate,sdch'; $this->headers[] = 'Accept-Language:en-US,en;q=0.8'; $this->headers[] = 'Cache-Control:max-age=0'; $this->headers[] = 'Connection:keep-alive'; $this->user_agent = 'User-Agent:Mozilla/5.0 (SepidarSoft [Organic Search Engine Crawler] Linux Edition) AppleWebKit/536.5 (KHTML, like Gecko) SepidarBrowser/1.0.100.52 Safari/536.5'; $this->compression=$compression; $this->proxy=$proxy; $this->cookies=$cookies; if ($this->cookies == TRUE) $this->cookie($cookie); } function cookie($cookie_file) { if (file_exists($cookie_file)) { $this->cookie_file=$cookie_file; } else { fopen($cookie_file,'w') or $this->error('The cookie file could not be opened. Make sure this directory has the correct permissions'); $this->cookie_file=$cookie_file; @fclose($this->cookie_file); } } function GET($url) { $process = curl_init($url); curl_setopt($process, CURLOPT_HTTPHEADER, $this->headers); curl_setopt($process, CURLOPT_HEADER, 1); curl_setopt($process, CURLOPT_USERAGENT, $this->user_agent); if ($this->cookies == TRUE) curl_setopt($process, CURLOPT_COOKIEFILE, $this->cookie_file); if ($this->cookies == TRUE) curl_setopt($process, CURLOPT_COOKIEJAR, $this->cookie_file); curl_setopt($process,CURLOPT_ENCODING , $this->compression); curl_setopt($process, CURLOPT_TIMEOUT, 30); if ($this->proxy) curl_setopt($process, CURLOPT_PROXY, $this->proxy); curl_setopt($process, CURLOPT_RETURNTRANSFER, 1); curl_setopt($process, CURLOPT_FOLLOWLOCATION, 1); $response = curl_exec($process); $header_size = curl_getinfo($process,CURLINFO_HEADER_SIZE); $result['Header'] = HeaderProc(substr($response, 0, $header_size),'',1); foreach($result['Header'] as $HeaderK=>$HeaderP){ if(!is_array($HeaderP['Set-Cookie']))continue; foreach($HeaderP['Set-Cookie'] as $key=>$val){ $result['Header'][$HeaderK]['Set-Cookie'][$key]=$this->CookieAnalysis($val); } } $result['Body'] = substr( $response, $header_size ); $result['HTTP_State'] = curl_getinfo($process,CURLINFO_HTTP_CODE); $result['URL'] = curl_getinfo($process,CURLINFO_EFFECTIVE_URL); curl_close($process); return $result; } function POST($url,$data) { $process = curl_init($url); curl_setopt($process, CURLOPT_HTTPHEADER, $this->headers); curl_setopt($process, CURLOPT_HEADER, 1); curl_setopt($process, CURLOPT_USERAGENT, $this->user_agent); if ($this->cookies == TRUE) curl_setopt($process, CURLOPT_COOKIEFILE, $this->cookie_file); if ($this->cookies == TRUE) curl_setopt($process, CURLOPT_COOKIEJAR, $this->cookie_file); curl_setopt($process, CURLOPT_ENCODING , $this->compression); curl_setopt($process, CURLOPT_TIMEOUT, 30); if ($this->proxy) curl_setopt($process, CURLOPT_PROXY, $this->proxy); curl_setopt($process, CURLOPT_POSTFIELDS, $data); curl_setopt($process, CURLOPT_RETURNTRANSFER, 1); curl_setopt($process, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($process, CURLOPT_POST, 1); $response = curl_exec($process); $header_size = curl_getinfo($process,CURLINFO_HEADER_SIZE); $result['Header'] = HeaderProc(substr($response, 0, $header_size),'',1); foreach($result['Header'] as $HeaderK=>$HeaderP){ if(!is_array($HeaderP['Set-Cookie']))continue; foreach($HeaderP['Set-Cookie'] as $key=>$val){ $result['Header'][$HeaderK]['Set-Cookie'][$key]=$this->CookieAnalysis($val); } } $result['Body'] = substr( $response, $header_size ); $result['HTTP_State'] = curl_getinfo($process,CURLINFO_HTTP_CODE); $result['URL'] = curl_getinfo($process,CURLINFO_EFFECTIVE_URL); curl_close($process); return $result; } function error($error) { echo "
cURL Error
$error
"; die; } }
в function HeaderProc($response,$Run="",$String=1/*[Is 1 IF Use for String Mode ]*/){ if($String==1){ $response=explode("\r\n",$response); } $PartHeader=0; $out[$PartHeader]=array(); while(list($key,$val)=each($response)){ $name=''; $value=''; $flag=false; for($i=0;$iCookie=array(); preg_match("~(.*?)=(.*?);~si",' '.$Cookie.'; ',$M); $this->Cookie[trim($M[1])]=trim($M[2]); return $this->Cookie; } function cURL($cookies=false,$cookie='cookies.txt',$compression='gzip',$proxy='') { $this->headers[] = 'Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'; $this->headers[] = 'Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3'; $this->headers[] = 'Accept-Encoding:gzip,deflate,sdch'; $this->headers[] = 'Accept-Language:en-US,en;q=0.8'; $this->headers[] = 'Cache-Control:max-age=0'; $this->headers[] = 'Connection:keep-alive'; $this->user_agent = 'User-Agent:Mozilla/5.0 (SepidarSoft [Organic Search Engine Crawler] Linux Edition) AppleWebKit/536.5 (KHTML, like Gecko) SepidarBrowser/1.0.100.52 Safari/536.5'; $this->compression=$compression; $this->proxy=$proxy; $this->cookies=$cookies; if ($this->cookies == TRUE) $this->cookie($cookie); } function cookie($cookie_file) { if (file_exists($cookie_file)) { $this->cookie_file=$cookie_file; } else { fopen($cookie_file,'w') or $this->error('The cookie file could not be opened. Make sure this directory has the correct permissions'); $this->cookie_file=$cookie_file; @fclose($this->cookie_file); } } function GET($url) { $process = curl_init($url); curl_setopt($process, CURLOPT_HTTPHEADER, $this->headers); curl_setopt($process, CURLOPT_HEADER, 1); curl_setopt($process, CURLOPT_USERAGENT, $this->user_agent); if ($this->cookies == TRUE) curl_setopt($process, CURLOPT_COOKIEFILE, $this->cookie_file); if ($this->cookies == TRUE) curl_setopt($process, CURLOPT_COOKIEJAR, $this->cookie_file); curl_setopt($process,CURLOPT_ENCODING , $this->compression); curl_setopt($process, CURLOPT_TIMEOUT, 30); if ($this->proxy) curl_setopt($process, CURLOPT_PROXY, $this->proxy); curl_setopt($process, CURLOPT_RETURNTRANSFER, 1); curl_setopt($process, CURLOPT_FOLLOWLOCATION, 1); $response = curl_exec($process); $header_size = curl_getinfo($process,CURLINFO_HEADER_SIZE); $result['Header'] = HeaderProc(substr($response, 0, $header_size),'',1); foreach($result['Header'] as $HeaderK=>$HeaderP){ if(!is_array($HeaderP['Set-Cookie']))continue; foreach($HeaderP['Set-Cookie'] as $key=>$val){ $result['Header'][$HeaderK]['Set-Cookie'][$key]=$this->CookieAnalysis($val); } } $result['Body'] = substr( $response, $header_size ); $result['HTTP_State'] = curl_getinfo($process,CURLINFO_HTTP_CODE); $result['URL'] = curl_getinfo($process,CURLINFO_EFFECTIVE_URL); curl_close($process); return $result; } function POST($url,$data) { $process = curl_init($url); curl_setopt($process, CURLOPT_HTTPHEADER, $this->headers); curl_setopt($process, CURLOPT_HEADER, 1); curl_setopt($process, CURLOPT_USERAGENT, $this->user_agent); if ($this->cookies == TRUE) curl_setopt($process, CURLOPT_COOKIEFILE, $this->cookie_file); if ($this->cookies == TRUE) curl_setopt($process, CURLOPT_COOKIEJAR, $this->cookie_file); curl_setopt($process, CURLOPT_ENCODING , $this->compression); curl_setopt($process, CURLOPT_TIMEOUT, 30); if ($this->proxy) curl_setopt($process, CURLOPT_PROXY, $this->proxy); curl_setopt($process, CURLOPT_POSTFIELDS, $data); curl_setopt($process, CURLOPT_RETURNTRANSFER, 1); curl_setopt($process, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($process, CURLOPT_POST, 1); $response = curl_exec($process); $header_size = curl_getinfo($process,CURLINFO_HEADER_SIZE); $result['Header'] = HeaderProc(substr($response, 0, $header_size),'',1); foreach($result['Header'] as $HeaderK=>$HeaderP){ if(!is_array($HeaderP['Set-Cookie']))continue; foreach($HeaderP['Set-Cookie'] as $key=>$val){ $result['Header'][$HeaderK]['Set-Cookie'][$key]=$this->CookieAnalysis($val); } } $result['Body'] = substr( $response, $header_size ); $result['HTTP_State'] = curl_getinfo($process,CURLINFO_HTTP_CODE); $result['URL'] = curl_getinfo($process,CURLINFO_EFFECTIVE_URL); curl_close($process); return $result; } function error($error) { echo "
cURL Error
$error
"; die; } }

XmlRead

  class XmlRead{ static function Clean($html){ $html=preg_replace_callback("~(.*?)~si",function($m){ //print_r($m); // $m[2]=preg_replace("/\/\*(.*?)\*\/|[\t\r\n]/s"," ", " ".$m[2]." "); $m[2]=preg_replace("~//(.*?)\n~si"," ", " ".$m[2]." "); //echo $m[2]; return ""; }, $html); $search = array( "/ +/" => " ", "/||[\t\r\n]||\/\/ ||\]\]>|\/\/\]\]>|\/\/ ""); //$html = preg_replace(array_keys($search), array_values($search), $html); $search = array( "/\/\*(.*?)\*\/|[\t\r\n]/s" => "", "/ +\{ +|\{ +| +\{/" => "{", "/ +\} +|\} +| +\}/" => "}", "/ +: +|: +| +:/" => ":", "/ +; +|; +| +;/" => ";", "/ +, +|, +| +,/" => "," ); $html = preg_replace(array_keys($search), array_values($search), $html); preg_match_all('!(<(?:code|pre|script).*>[^<]+)!',$html,$pre); $html = preg_replace('!<(?:code|pre).*>[^<]+!', '#pre#', $html); $html = preg_replace('##', '', $html); $html = preg_replace('/[\r\n\t]+/', ' ', $html); $html = preg_replace('/>[\s]+<', $html); $html = preg_replace('/\s+/', ' ', $html); if (!empty($pre[0])) { foreach ($pre[0] as $tag) { $html = preg_replace('!#pre#!', $tag, $html,1); } } return($html); } function loadNprepare($content,$encod='') { $content=self::Clean($content); //$content=html_entity_decode(html_entity_decode($content)); // $content=htmlspecialchars_decode($content,ENT_HTML5); $this->DataPage=''; preg_match('~(.*?)~si',$content,$M); $this->DataPage=$M[2]; $HTML=$this->DataPage; $HTML="Untitled Document".$HTML.""; $dom= new DOMDocument; $HTML = str_replace("&", "&", $HTML); // disguise &s going IN to loadXML() // $dom->substituteEntities = true; // collapse &s going OUT to transformToXML() $dom->recover = TRUE; @$dom->loadHTML('' .$HTML); // dirty fix foreach ($dom->childNodes as $item) if ($item->nodeType == XML_PI_NODE) $dom->removeChild($item); // remove hack $dom->encoding = 'UTF-8'; // insert proper return $dom; } function GetBYClass($Doc,$ClassName){ $finder = new DomXPath($Doc); return($finder->query("//*[contains(@class, '$ClassName')]")); } function extractText($node) { if($node==NULL)return false; if (XML_TEXT_NODE === $node->nodeType || XML_CDATA_SECTION_NODE === $node->nodeType) { return $node->nodeValue; } else if (XML_ELEMENT_NODE === $node->nodeType || XML_DOCUMENT_NODE === $node->nodeType || XML_DOCUMENT_FRAG_NODE === $node->nodeType) { if ('script' === $node->nodeName) return ''; $text = ''; foreach($node->childNodes as $childNode) { $text .= $this->extractText($childNode); } return $text; } } function DOMRemove(DOMNode $from) { $from->parentNode->removeChild($from); } } 

class вызова и conf для вашей страницы

  $cc = new cURL(); // $XmlRead=new XmlRead(); $Data=$cc->get('http://www.ncbi.nlm.nih.gov/sra/ERX086768?report=FullXml'); //get page $doc=$XmlRead->loadNprepare($Data['Body']);//load as html //remove two part of page related to your page . $productspec=$XmlRead->DOMRemove($XmlRead->GetBYClass($doc,'title')->item(0)); $productspec=$XmlRead->DOMRemove($XmlRead->GetBYClass($doc,'aux')->item(0)); //select xml part $productspec=$XmlRead->GetBYClass($doc,'rprt'); foreach($productspec as $data) { $content=html_entity_decode(html_entity_decode($XmlRead->extractText($data)));//decode as entity html print_r($content); } 

вывод:

  ERX086768SC_EXP_7229_8#56ERP000913Genome_diversity_in_Streptococcus_dysgalactiae_subspecies_equisimilis-sc-2011-09-22T08:43:17Z-1977StandardERS074283MR223754-sc-2011-11-18T11:31:44Z-13064704008297WGSGENOMICRANDOM0Application ReadForward11Application ReadReverseIllumina HiSeq 2000ERA119046ERP000913-sc-20120417-2ERP000913Genome_diversity_in_Streptococcus_dysgalactiae_subspecies_equisimilis-sc-2011-09-22T08:43:17Z-1977Genome_diversity_in_Streptococcus_dysgalactiae_subspecies_equisimilishttp://www.sanger.ac.uk/resources/downloads/bacteria/Genome_diversity_in_Streptococcus_dysgalactiae_subspecies_equisimilishttp://www.sanger.ac.uk/resources/downloads/bacteria/This data is part of a pre-publication release. For information on the proper use of pre-publication data shared by the Wellcome Trust Sanger Institute (including details of any publication moratoria),please see http://www.sanger.ac.uk/datasharing/ERS074283MR223754-sc-2011-11-18T11:31:44Z-1306470Streptococcus dysgalactiae subspecies equisimilis119602Streptococcus dysgalactiae subsp. equisimilisbiosample859730StrainMR223754Sample DescriptionArrayExpress-StrainOrLineMR223754ArrayExpress-Sexnot applicableArrayExpress-SpeciesStreptococcus dysgalactiae subspecies equisimilisERR109334SC_RUN_7229_8#56ERX086768SC_EXP_7229_8#56