2013-04-06 2 views
3

Я пытаюсь отображать содержимое Xml в таблицах, все работает отлично, но некоторый контент в теге, который я не хочу отображать, хочу только изображение, но не Как разобрать HTML-контент CDATA XML с помощью SimpleXML?

Ноябрь 2012 calendar from 5.10 Тест

как в xml,

<content:encoded><![CDATA[<p>November 2012 calendar from 5.10 The Test</p> 
    <p><a class="shutterset_" href='http://trance-gemini.com/wordpress/wp-content/gallery/calendars/laura-bertram-trance-gemini-145-1080.jpg' title='&lt;br&gt;November 2012 calendar from 5.10 The Test&lt;br&gt; &lt;a href=&quot;</a></p>]]> 
</content:encoded> 

Я хочу, чтобы отобразить изображение, но не

ноября 2012 календарь с 5.10 Тест

.

<?php 
// load SimpleXML 
$item = new SimpleXMLElement('test1.xml', null, true); 

echo <<<EOF 
<table border="1px"> 
     <tr cl> 

     </tr>  
EOF; 
foreach($item->channel->item as $boo) // loop through our books 
{ 
     echo <<<EOF 

     <tr> 
      <td rowspan="3">{$boo->children('content', true)->encoded}</td> 
      <td>{$boo->title}</td> 
     </tr> 

     <tr> 
      <td>{$boo->description}</td> 
     </tr> 

     <tr> 
      <td>{boo->comments}</td> 
     </tr> 
EOF; 
} 
echo '</table>'; 
?> 
+1

«Содержимое в теге, которое я держу в эфионе» ??? Немного больше усилий в написании хорошего вопроса поможет. – str

+0

да, у меня есть обновление моего que – user2249819

+0

возможного дубликата [PHP DOMDocument получения атрибута тега] (http://stackoverflow.com/questions/1597746/php-domdocument-getting-attribute-of-tag) - вы можете не понимать, почему Я предлагаю этот дубликат, см. Мой ответ ниже: http://stackoverflow.com/a/15850774/367456 – hakre

ответ

6

Я когда-то ответил, но я не нахожу ответа больше.

Если вы посмотрите на строке (упрощенный/Приукрашено):

<content:encoded><![CDATA[ 
    <p>Lorem Ipsom</p> 
    <p> 
     <a href='laura-bertram-trance-gemini-145-1080.jpg' 
     title='&lt;br&gt;November 2012 calendar from 5.10 The Test&lt;br&gt; &lt;a href=&quot;</a> 
    </p>]]> 
</content:encoded> 

Вы можете видеть, что у вас есть HTML закодирован внутри Узел значение <content:encoded> элемента. Итак, сначала вы должны получить значение HTML, который вы уже сделать:

$html = $boo->children('content', true)->encoded; 

Затем вам нужно разобрать HTML внутри $html. С какими библиотеками HTML разбор можно сделать с помощью PHP описан в:

Если вы решили использовать более или менее рекомендуется DOMDocument для работы, вам нужно только, чтобы получить значение атрибута определенного элемента:

Или для своей сестры библиотеки SimpleXML вы уже используете (так что это более рекомендуется, см, а следующий раздел):


В контексте Вашего вопроса здесь следующий совет:

Вы используете SimpleXML. DOMDocument - это сестра-библиотека, что означает, что вы можете обмениваться между двумя, поэтому вам не нужно изучать полную новую библиотеку.

Например, вы можете использовать только функцию разбора HTML DOMDocument, но затем импортируйте ее в SimpleXML. Это полезно, потому что SimpleXML не поддерживает разбор HTML.

Это работает через simplexml_import_dom().

Упрощенная шаг за шагом пример:

// get the HTML string out of the feed: 
$htmlString = $boo->children('content', true)->encoded; 

// create DOMDocument for HTML parsing: 
$htmlParser = new DOMDocument(); 

// load the HTML: 
$htmlParser->loadHTML($htmlString); 

// import it into simplexml: 
$html = simplexml_import_dom($htmlParser); 

Теперь вы можете использовать $html как новый SimpleXMLElement, который представляет собой HTML-документ. Поскольку в ваших фрагментах HTML не было никаких тегов <body>, в соответствии со спецификацией HTML они помещаются в тег <body>. Это позволит вам, например, чтобы получить доступ к атрибуту первого <a>href внутри второго <p> элемента в вашем примере: #

// access the element you're looking for: 
$href = $html->body->p[1]->a['href']; 

Здесь полный вид сверху (Online Demo):

// get the HTML string out of the feed: 
$htmlString = $boo->children('content', true)->encoded; 

// create DOMDocument for HTML parsing: 
$htmlParser = new DOMDocument(); 

// your HTML gives parser warnings, keep them internal: 
libxml_use_internal_errors(true); 

// load the HTML: 
$htmlParser->loadHTML($htmlString); 

// import it into simplexml: 
$html = simplexml_import_dom($htmlParser); 

// access the element you're looking for: 
$href = $html->body->p[1]->a['href']; 

// output it 
echo $href, "\n"; 

И что он выводит:

laura-bertram-trance-gemini-145-1080.jpg 
+1

Я бы добавил только одно: для здравого смысла позже добавьте явное '(string)' cast in '$ htmlString = (string) $ boo ...' и '$ href = (string) $ html ...'. Я нахожу умственные накладные расходы, всегда добавляя его, когда не требуется меньше затрат на отладку тех случаев, когда это было необходимо, но вы не понимали. – IMSoP

+0

@IMSoP: вам никогда не понадобится это в контексте, называемом строковым контекстом в PHP. Полезно знать об этом, даже если не считать SimpleXML. Например. с 'echo' это всегда не нужно. – hakre

+0

@hakre: это работа, когда я запускаю html-файл, но этот код я применил в моем php-файле. Я получаю сообщение об ошибке.> Уведомление: Неопределенная переменная: htmlString в E: \ Work Space \ xampp \ htdocs \ Xml- Paser \ note1.php в строке 20 Примечание: неопределенная переменная: htmlParser в E: \ WorkSpace \ xampp \ htdocs \ Xml-Paser \ note1.php в строке 30 – user2249819

-3

вам нужно будет разобрать URL изображения, например, с помощью preg_match и это регулярное выражение '(http://(?:[^']*))'

+0

Thanx Vprimachenko, но можете ли вы сказать мне, в каком месте я это положил, можете ли вы дать мне один пример, или вы можете сказать мне, в каком месте я должен изменить? – user2249819

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