Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: X технологии > изменение значения узла не лету


Автор: armor85 7.4.2008, 14:48
Здравствуйте,

есть xml файл

Код

<building>
    <object>
        <ID>41</ID>
        <class>Elite</class>
        <price>1900</price>
        <floor>6</floor>
    </object>
    <object>
        <ID>40</ID>
        <class> Business</class>
        <price>1200</price>
        <floor>5</floor>
    </object>
</building>


он загружается динамически php скриптом,

Код

<?
header("Content-Type: text/xml"); 
$doc = new DOMDocument('1.0', 'windows-1251');
$doc->load('test.xml');
echo $doc->saveXML();
?>


как мне до вывода этого файла, поле <price> во всех узлах умножить на 100?


Автор: mishaSL 7.4.2008, 16:04
К примеру так:
Код

<?php

$xml = <<<XML
<building>
    <object>
        <ID>41</ID>
        <class>Elite</class>
        <price>1900</price>
        <floor>6</floor>
    </object>
    <object>
        <ID>40</ID>
        <class> Business</class>
        <price>1200</price>
        <floor>5</floor>
    </object>
</building>
XML;

header("Content-Type: text/xml"); 
$doc = new DOMDocument('1.0', 'windows-1251');
$doc->loadXML($xml);
$listPrices = $doc->getElementsByTagName('price');
foreach($listPrices as $price) {
    $price->nodeValue = intval($price->nodeValue)*100;
}
echo $doc->saveXML();

?>

Автор: armor85 16.4.2008, 16:22
а если например все поля с одинаковыми именами 

Код

<building>
    <object>
        <cell>41</cell>
        <cell>Elite</cell>
        <cell type="edit">1900</cell>
        <cell>6</cell>
    </object>
    <object>
        <cell>40</cell>
        <cell> Business</cell>
        <cell type="edit">1200</cell>
        <cell>5</cell>
    </object>
</building>


как добраться до того, которое с параметром "type"?

Автор: mishaSL 18.4.2008, 10:15
armor85, самый простой вариант на мой взгляд с помощью XPath:
Код

<?php
$xml = <<<XML
<building>
    <object>
        <cell>41</cell>
        <cell>Elite</cell>
        <cell type="edit">1900</cell>
        <cell>6</cell>
    </object>
    <object>
        <cell>40</cell>
        <cell> Business</cell>
        <cell type="edit">1200</cell>
        <cell>5</cell>
    </object>
</building>
XML;
header("Content-Type: text/xml"); 
$doc = new DOMDocument('1.0', 'windows-1251');
$doc->loadXML($xml);
$objXpath = new DOMXPath($doc);
$listPrices   = $objXpath->query('/building/object/cell[@type="edit"]');
if ($listPrices->length != 0) {
    foreach($listPrices as $price) {
        $price->nodeValue = intval($price->nodeValue)*100;
    }
}

echo $doc->saveXML();
?>

Автор: armor85 18.4.2008, 11:25
ОГРОМНОЕ спасибо!   smile 

Автор: eee 27.10.2008, 18:23
mishaSL, не могу понять почему у меня пишет такое?
Код

Warning: Cannot modify header information - headers already sent by (output started at /var/www/.../fuck_xml.php:1) in /var/www/.../fuck_xml.php on line 62

Warning: domdocument() expects parameter 2 to be long, string given in /var/www/.../fuck_xml.php on line 63

Fatal error: Call to undefined function: loadxml() in /var/www/.../fuck_xml.php on line 64

ну с заголовком то понятно что-то уже вывелось, ито не понятно что))

ну а со слишком «длинным параметром» и не найденной loadxm() вообще неясно, тем более что на php.net написано что никаких установок не требуется, т.к. DOMDocument() есть часть ядра)

привожу код, хотя он абсолютно идентичен:
Код

<?php

$xml = <<<XML
<building>
    <object>
        <ID>41</ID>
        <class>Elite</class>
        <price>1900</price>
        <floor>6</floor>
    </object>
    <object>
        <ID>40</ID>
        <class> Business</class>
        <price>1200</price>
        <floor>5</floor>
    </object>
</building>
XML;

header("Content-Type: text/xml");
$doc = new DOMDocument('1.0', 'windows-1251');
$doc->loadXML($xml);
$listPrices = $doc->getElementsByTagName('price');
foreach($listPrices as $price) {javascript: sendForm('submit');
    $price->nodeValue = intval($price->nodeValue)*100;
}
echo $doc->saveXML();

?>

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)