Разбор PHP xml xpath - PullRequest
       3

Разбор PHP xml xpath

1 голос
/ 04 августа 2011

XML

<person>
    <description>
        <p>blah blah blah</p>
        <p>kjdsfksdjf</p>
    </description>
</person>
<person>
    <description>
        k kjsdf kk sak kfsdjk sadk
    </description>
</person>

Я бы хотел разобрать описание, чтобы оно возвращало html-теги, которые находятся внутри.

Я попробовал оба из них, но безуспешно

$description = ereg_replace('<description>|</description>','',$person->description->asXML());

$description = $person->description;

Есть предложения?

EDIT

То, что я пытаюсь сделать, это импортировать файл XML в базу данных mysql. Все работает, примите то, что упомянуто выше ... теги абзаца внутри описания не отображаются ... и они должны быть там. Поле mysql «описание» устанавливается как текстовое поле. Если бы я должен был проанализировать xml для вывода в браузере, то $description = ereg_replace('<description>|</description>','',$person->description->asXML()); работает нормально ... это не так, хотя, когда я пытаюсь импортировать в mysql. Нужно ли что-то добавить в MySQL INSERT? mysql_query("UPDATE table SET description = '$value' WHERE id = '$id'");

Ответы [ 2 ]

3 голосов
/ 04 августа 2011

Пожалуйста, ознакомьтесь с SimpleXml API:

$xml = <<< XML
<person>
    <description>
        <p>blah blah blah</p>
        <p>kjdsfksdjf</p>
    </description>
</person>
XML;

$person = simplexml_load_string($xml);
foreach ($person->description->children() as $child) {
    echo $child->asXml();
}

дает

<p>blah blah blah</p><p>kjdsfksdjf</p>

Обратите внимание, что SimpleXml не способен делать то же самое для второго элемента описания, который вы показываете, потому что он не имеет понятия текстовых узлов, например

$xml = <<< XML
<person>
    <description>
        k kjsdf kk sak kfsdjk sadk
    </description>
</person>
XML;
$person = simplexml_load_string($xml);
foreach ($person->description->children() as $child) {
    echo $child->asXml();
}

вернет пустую строку. Если вы хотите унифицированный API, используйте DOM:

$xml = <<< XML
<people>
    <person>
        <description>
            <p>blah blah blah</p>
            <p>kjdsfksdjf</p>
        </description>
    </person>
    <person>
        <description>
            k kjsdf kk sak kfsdjk sadk
        </description>
    </person>
</people>
XML;

$dom = new DOMDocument;
$dom->loadXml($xml);
$xp = new DOMXPath($dom);
foreach ($xp->query('/people/person/description/node()') as $child) {
    echo $dom->saveXml($child);
}

даст

        <p>blah blah blah</p>
        <p>kjdsfksdjf</p>

        k kjsdf kk sak kfsdjk sadk

Для импорта XML в MySql вы также можете использовать http://dev.mysql.com/doc/refman/5.5/en/load-xml.html

0 голосов
/ 04 августа 2011

Я хотел бы проанализировать описание, чтобы оно возвращало html-теги, которые находятся внутри.

В XPath вы должны выбрать дочерние узлы элементов description.

Использование:

 "//person/description/*"

чтобы получить все дочерние узлы (только html тэги) или

 "//person/description/node()"

чтобы получить все дочерние узлы (HTML-теги и текстовые узлы).

Например, этот код php:

<?php
$xml = simplexml_load_file("test.xml");

$result = $xml->xpath("//person/description/*");

print_r($result);
?>

Возвращает массив SimpleXMLElement, которые являются потомками description. Каждый элемент извлекается со всеми его узлами-потомками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...