/**
* Creates an ImportXMLReader drawing from the source provided
- * @param string $source
+ * @param ImportStreamSource $source
*/
- function __construct( $source ) {
+ function __construct( ImportStreamSource $source ) {
$this->reader = new XMLReader();
- stream_wrapper_register( 'uploadsource', 'UploadSourceAdapter' );
+ if ( !in_array( 'uploadsource', stream_get_wrappers() ) ) {
+ stream_wrapper_register( 'uploadsource', 'UploadSourceAdapter' );
+ }
$id = UploadSourceAdapter::registerSource( $source );
if ( defined( 'LIBXML_PARSEHUGE' ) ) {
$this->reader->open( "uploadsource://$id", null, LIBXML_PARSEHUGE );
}
}
+ /**
+ * Retrieves the contents of the named attribute of the current element.
+ * @param string $attr The name of the attribute
+ * @return string The value of the attribute or an empty string if it is not set in the current element.
+ */
+ public function nodeAttribute( $attr ) {
+ return $this->reader->getAttribute( $attr );
+ }
+
/**
* Shouldn't something like this be built-in to XMLReader?
* Fetches text contents of the current element, assuming
private function handleSiteInfo() {
// Site info is useful, but not actually used for dump imports.
// Includes a quick short-circuit to save performance.
- if ( ! $this->mSiteInfoCallback ) {
+ if ( !$this->mSiteInfoCallback ) {
$this->reader->next();
return true;
}
&$pageInfo ) ) ) {
// Do nothing
} elseif ( in_array( $tag, $normalFields ) ) {
- $pageInfo[$tag] = $this->nodeContents();
- if ( $tag == 'title' ) {
- $title = $this->processTitle( $pageInfo['title'] );
+ // An XML snippet:
+ // <page>
+ // <id>123</id>
+ // <title>Page</title>
+ // <redirect title="NewTitle"/>
+ // ...
+ // Because the redirect tag is built differently, we need special handling for that case.
+ if ( $tag == 'redirect' ) {
+ $pageInfo[$tag] = $this->nodeAttribute( 'title' );
+ } else {
+ $pageInfo[$tag] = $this->nodeContents();
+ if ( $tag == 'title' ) {
+ $title = $this->processTitle( $pageInfo['title'] );
- if ( !$title ) {
- $badTitle = true;
- $skip = true;
- }
+ if ( !$title ) {
+ $badTitle = true;
+ $skip = true;
+ }
- $this->pageCallback( $title );
- list( $pageInfo['_title'], $origTitle ) = $title;
+ $this->pageCallback( $title );
+ list( $pageInfo['_title'], $origTitle ) = $title;
+ }
}
} elseif ( $tag == 'revision' ) {
$this->handleRevision( $pageInfo );
private $mPosition;
/**
- * @param string $source
+ * @param ImportStreamSource $source
* @return string
*/
- static function registerSource( $source ) {
+ static function registerSource( ImportStreamSource $source ) {
$id = wfRandomString();
self::$sourceRegistrations[$id] = $source;