Чтение атрибута пространства имен из SimpleXmlElement (импортируется из XMLReader) - PullRequest
6 голосов
/ 14 мая 2011

Я пытаюсь прочитать большой XML-файл (около 40 МБ) и использовать эти данные для обновления БД моего приложения.

Похоже, я нашел хороший компромисс с точки зрения прошедшего времени.время / память с использованием XMLReader и simplexml_import_dom (), но я не могу получить значение атрибутов с двоеточием в их имени ... например <g:attr_name>.

Если я просто использую $ reader-> read ()Функция для каждого узла «product» позволяет извлекать значение как $ reader-> value, но если я раскрываю () узел и копирую его с помощью $ doc-> importNode, эти атрибуты игнорируются.

    $reader = new XMLReader();
    $reader->open(__XML_FILE__);
    $doc = new DOMDocument;

    while ($reader->read()) {
        switch ($reader->nodeType) {
            case (XMLREADER::ELEMENT):
                if($reader->localName=="product"){
                   $node = simplexml_import_dom($doc->importNode($reader->expand(), true));
                   echo $node->attr_name."<br><br>";
                   $reader->next('product');

                } 

        }
    }

Вероятно, я что-то упускаю ... любой совет будет очень ценным!

Спасибо.

1 Ответ

6 голосов
/ 14 мая 2011

Атрибуты с двоеточиями в названии имеют пространство имен .

Часть перед двоеточием является префиксом, который зарегистрирован в некотором пространстве имен (обычно в корневом узле).Чтобы получить доступ к атрибутам пространства имен SimpleXmlElement, необходимо передать пространство имен методу attributes():

$attributes = $element->attributes('some-namespace'); // or
$attributes = $element->attributes('g', TRUE);        // and then
echo $attributes['name'];

То же самое относится к дочерним элементам узла.Доступ к ним осуществляется с помощью метода childrens()

$children = $element->children('some-namespace'); // or
$children = $element->children('g', TRUE);        // and then
echo $children->elementName;

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

...