PHP DOM нечетный вывод? - PullRequest
       8

PHP DOM нечетный вывод?

0 голосов
/ 27 января 2011

Вот мой XML:

<?xml version="1.0" encoding="UTF-8"?>
<columns>
    <column>
        <originalName>ORP</originalName>
        <name>ORP</name>
        <visible>1</visible>
    </column>
    <column>
        <originalName>OKRES</originalName>
        <name>OKRES</name>
        <visible>1</visible>
    </column>
    <column>
        <originalName>Objekt</originalName>
        <name>Objekt</name>
        <visible>1</visible>
    </column>
    <column>
        <originalName>Školenie</originalName>
        <name>Skolenie</name>
        <visible>1</visible>
    </column>
    <column>
        <originalName>Dátum posledného školenia OPP</originalName>
        <name>DatumPoslednehoSkoleniaOPP</name>
        <visible>1</visible>
    </column>
    <column>
        <originalName>Dátum posledného školenia OPP</originalName>
        <name>DatumPoslednehoSkoleniaOPP1</name>
        <visible>0</visible>
    </column>
</columns>

Мой код для перебора всех столбцов:

$schema = new DOMDocument();
$schema->load(BASE_PATH.'/schema.xml');
foreach ($schema->getElementsByTagName('column') as $column) {
    foreach($column->childNodes as $child) {
        echo $child->nodeName, ' => ', $child->nodeValue, '<br />';
    }
}

Теперь вывод самый странный. Я не понимаю, почему там постоянно появляется «#text =>»:

#text =>
originalName => ORP
#text =>
name => ORP
#text =>
visible => 1
#text =>
#text =>
originalName => OKRES
#text =>
name => OKRES
#text =>
visible => 1
#text =>
#text =>
originalName => Objekt
#text =>
name => Objekt
#text =>
visible => 1
#text =>
#text =>
originalName => Školenie
#text =>
name => Skolenie
#text =>
visible => 1
#text =>
#text =>
originalName => Dátum posledného školenia OPP
#text =>
name => DatumPoslednehoSkoleniaOPP
#text =>
visible => 1
#text =>
#text =>
originalName => Dátum posledného školenia OPP
#text =>
name => DatumPoslednehoSkoleniaOPP1
#text =>
visible => 0
#text =>

Ответы [ 3 ]

2 голосов
/ 27 января 2011

Вы пробовали и load() с опцией LIBXML_NOBLANKS?

В качестве альтернативы loadXML() может делать то, что вы хотите (я предполагаю здесь).


Согласно PHP, DOM и XML: Часть 2 - DOMDocument вы должны либо:

$schema->load(BASE_PATH.'/schema.xml', LIBXML_NOBLANKS);

, либо

$schema = new DOMDocument();
$schema->preserveWhiteSpace = false; // This is the important part
$schema->load(BASE_PATH.'/schema.xml');

В зависимости от вашей версии PHP.

2 голосов
/ 27 января 2011

Вы можете пропустить элементы DOMText:

$schema = new DOMDocument();
$schema->load(BASE_PATH.'/schema.xml');
foreach ($schema->getElementsByTagName('column') as $column) {
    foreach($column->childNodes as $child) {
        if ($child instanceof DOMElement) { // (! $child instanceof DOMText)
            echo $child->nodeName, ' => ', $child->nodeValue, '<br />';
        }
    }
}

Или использовать DOMXPath:

$doc = new DOMDocument();
$doc->load(BASE_PATH.'/schema.xml');
$xpath = new DOMXPath($doc);

foreach($xpath->query('/columns/column/*') as $child)
{
    echo $child->nodeName, ' => ', $child->nodeValue, "\n";
}
1 голос
/ 27 января 2011
<?php
$schema = new DOMDocument();
$schema->load('schema.xml');
foreach ($schema->getElementsByTagName('column') as $column) {
    $array = false;$i=0;
    foreach ($column->childNodes as $childNode){
        $array[$i] = $childNode->firstChild->nodeValue;
        $i++;
    }
    echo $array[1]." = > ".$array[3]." = > ".$array[5]."<br>";
}
?>

попробуй это ... его не соблюдая стандарты и бла бла бла или что-то в этом роде, но это работает! : P

p.s. здесь у вас есть несколько объяснений / уроков, если вы хотите прочитать ...

...