xml parsing finished
This commit is contained in:
parent
721b36f773
commit
bfc2114ed7
@ -6,9 +6,19 @@ class DailyImageWidget {
|
||||
'title',
|
||||
'image',
|
||||
'styles'
|
||||
);
|
||||
);
|
||||
|
||||
$this->data_source = "http://hubblesite.org/gallery/album/daily_image.php";
|
||||
$this->data = false;
|
||||
|
||||
$this->has_simplexml = class_exists('SimpleXMLElement');
|
||||
|
||||
$this->_valid_column_names = array('title', 'caption', 'date', 'image_url', 'gallery_url', 'credits');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the list of display options from the WordPress options database.
|
||||
*/
|
||||
function get_display_options() {
|
||||
$display_options = get_option('hubblesite-daily-image-options');
|
||||
$this->display_options = array();
|
||||
@ -26,6 +36,9 @@ class DailyImageWidget {
|
||||
return $this->display_options;
|
||||
}
|
||||
|
||||
/**
|
||||
* Render the widget.
|
||||
*/
|
||||
function render() {
|
||||
if (!empty($this->data) && is_array($this->data)) {
|
||||
$options = $this->get_display_options();
|
||||
@ -63,6 +76,72 @@ class DailyImageWidget {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse a string of XML from the HubbleSite Daily Gallery Image feed.
|
||||
*/
|
||||
function parse_xml($xml_text) {
|
||||
if ($this->has_simplexml) {
|
||||
try {
|
||||
$xml = new SimpleXMLElement($xml_text);
|
||||
|
||||
if ($xml !== false) {
|
||||
$data = array();
|
||||
$is_valid = true;
|
||||
foreach ($this->_valid_column_names as $node) {
|
||||
if ($xml->{$node}) {
|
||||
$data[$node] = (string)$xml->{$node};
|
||||
} else {
|
||||
$is_valid = false; break;
|
||||
}
|
||||
}
|
||||
|
||||
if ($is_valid) {
|
||||
$this->data = $data;
|
||||
} else {
|
||||
$this->data = false;
|
||||
}
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
$this->data = false;
|
||||
}
|
||||
} else {
|
||||
$parser = xml_parser_create();
|
||||
$this->_character_data = "";
|
||||
$this->_xml_data = array();
|
||||
xml_set_element_handler(
|
||||
$parser,
|
||||
array($this, "_start_element_handler"),
|
||||
array($this, "_end_element_handler")
|
||||
);
|
||||
xml_set_character_data_handler($parser, array($this, "_character_data_handler"));
|
||||
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
|
||||
$this->data = false;
|
||||
if (xml_parse($parser, $xml_text)) {
|
||||
if (count($this->_xml_data) == count($this->_valid_column_names)) {
|
||||
$this->data = $this->_xml_data;
|
||||
}
|
||||
}
|
||||
}
|
||||
return $this->data;
|
||||
}
|
||||
|
||||
function _start_element_handler($parser, $name, $attributes) {
|
||||
$this->_character_data = "";
|
||||
}
|
||||
|
||||
function _end_element_handler($parser, $name) {
|
||||
$name = strtolower($name);
|
||||
if (in_array($name, $this->_valid_column_names)) {
|
||||
$this->_xml_data[$name] = $this->_character_data;
|
||||
}
|
||||
|
||||
$this->_character_data = "";
|
||||
}
|
||||
|
||||
function _character_data_handler($parser, $data) {
|
||||
$this->_character_data .= $data;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
@ -94,7 +94,7 @@ class DailyImageWidgetTest extends PHPUnit_Framework_TestCase {
|
||||
|
||||
$this->assertTrue(!empty($result));
|
||||
|
||||
$this->assertTrue(($xml = _to_xml($result)) !== false);
|
||||
$this->assertTrue(($xml = _to_xml($result, true)) !== false);
|
||||
foreach ($xpath_tests as $xpath => $result) {
|
||||
$this->assertTrue(_xpath_test($xml, $xpath, $result), $xpath);
|
||||
}
|
||||
@ -118,6 +118,56 @@ class DailyImageWidgetTest extends PHPUnit_Framework_TestCase {
|
||||
|
||||
$this->assertEquals($result, $this->diw->get_display_options());
|
||||
}
|
||||
|
||||
function providerTestParseBadXML() {
|
||||
return array(
|
||||
array(null),
|
||||
array(false),
|
||||
array("<xml"),
|
||||
array("<xml></yml>")
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider providerTestParseBadXML
|
||||
*/
|
||||
function testParseBadXML($xml) {
|
||||
foreach (array(true, false) as $simplexml) {
|
||||
$this->diw->has_simplexml = $simplexml;
|
||||
|
||||
$this->assertFalse($this->diw->parse_xml($xml));
|
||||
}
|
||||
}
|
||||
|
||||
function testParseXML() {
|
||||
foreach (array(true, false) as $simplexml) {
|
||||
$this->diw->has_simplexml = $simplexml;
|
||||
|
||||
$result = $this->diw->parse_xml(
|
||||
"<gallery>" .
|
||||
"<title>title</title>" .
|
||||
"<caption>caption</caption>" .
|
||||
"<date>12345</date>" .
|
||||
"<image_url>image_url</image_url>" .
|
||||
"<gallery_url>gallery_url</gallery_url>" .
|
||||
"<credits>credits</credits>" .
|
||||
"</gallery>"
|
||||
);
|
||||
|
||||
$this->assertEquals(
|
||||
array(
|
||||
'title' => 'title',
|
||||
'caption' => 'caption',
|
||||
'date' => '12345',
|
||||
'image_url' => 'image_url',
|
||||
'gallery_url' => 'gallery_url',
|
||||
'credits' => 'credits'
|
||||
),
|
||||
$result,
|
||||
"simplexml? $simplexml"
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
Loading…
Reference in New Issue
Block a user