0

マルチレベル ノードの xml があります。ノードを見つけることはできますが、ノードの値を更新する方法を知る必要があります。以下のファイルで、ノード チャネルをその属性で見つけることができますが、channelType などのノードの値を更新するにはどうすればよいですか?

コードを含む XML ファイルを次に示します。

<?xml version="1.0"?>
<systemConfigs>
<systemConfig cnfId="1">
    <moduleName>Module 1</moduleName>
    <channeles ch="1">
        <chId>1</chId>
        <channelName>Channel 1 of Module 1</channelName>
        <channelType>myFunc 1</channelType>
        <channelFunc>conFig</channelFunc>
        <eu>myFunc 1</eu>
        <custScale>myFunc 1</custScale>
        <rawMin>myFunc 1</rawMin>
        <rawMax>myFunc 1</rawMax>
        <euMin>myFunc 1</euMin>
        <euMax>myFunc 1</euMax>
        <dspFormat>myFunc 1</dspFormat>
        <digOfPrec>myFunc 1</digOfPrec>
    </channeles>
    <channeles ch="2">
        <chId>2</chId>
        <channelName>Channel 2 of Module 1</channelName>
        <channelType>myFunc 2</channelType>
        <channelFunc>conFig</channelFunc>
        <eu>myFunc 2</eu>
        <custScale>myFunc 2</custScale>
        <rawMin>myFunc 2</rawMin>
        <rawMax>myFunc 2</rawMax>
        <euMin>myFunc 2</euMin>
        <euMax>myFunc 2</euMax>
        <dspFormat>myFunc 2</dspFormat>
        <digOfPrec>myFunc 2</digOfPrec>
    </channeles>
</systemConfig>
<systemConfig cnfId="2">
    <moduleName>Module 2</moduleName>
    <channeles ch="3">
        <chId>3</chId>
        <channelName>Channel 1 of Module 2</channelName>
        <channelType>myFunc 1</channelType>
        <channelFunc>conFig</channelFunc>
        <eu>myFunc 1</eu>
        <custScale>myFunc 1</custScale>
        <rawMin>myFunc 1</rawMin>
        <rawMax>myFunc 1</rawMax>
        <euMin>myFunc 1</euMin>
        <euMax>myFunc 1</euMax>
        <dspFormat>myFunc 1</dspFormat>
        <digOfPrec>myFunc 1</digOfPrec>
    </channeles>
    <channeles ch="4">
        <chId>4</chId>
        <channelName>Channel 2 of Module 2</channelName>
        <channelType>myFunc 2</channelType>
        <channelFunc>conFig</channelFunc>
        <eu>myFunc 2</eu>
        <custScale>myFunc 2</custScale>
        <rawMin>myFunc 2</rawMin>
        <rawMax>myFunc 2</rawMax>
        <euMin>myFunc 2</euMin>
        <euMax>myFunc 2</euMax>
        <dspFormat>myFunc 2</dspFormat>
        <digOfPrec>myFunc 2</digOfPrec>
    </channeles>
</systemConfig>
</systemConfigs>

ここで、チャネル ch=4 の子ノードの値を更新したい

ここで、更新後、属性 ch=4 を持つノード チャネルのみが、このような新しい値で保存されます。

<channeles ch="4">
        <chId>4</chId>
        <channelName>Channel New Name</channelName>
        <channelType>New Channel Type</channelType>
        <channelFunc>New Func</channelFunc>
        <eu>New Eu</eu>
        <custScale>New Cust Scale</custScale>
        <rawMin>1</rawMin>
        <rawMax>10</rawMax>
        <euMin>1</euMin>
        <euMax>10</euMax>
        <dspFormat>scintific</dspFormat>
        <digOfPrec>10</digOfPrec>
    </channeles>

このようにノードを見つけることができます。

$doc = new DOMDocument();
$doc->load(BASEPATH.'data/sysConf.xml');
$selector = new DOMXPath($doc);
$query = '//channeles[@ch="4"]/*';
$list = $selector->query($query);
$node = $list->item(0);

$module = $node->parentNode->getElementsByTagName( "channelName" );
$channelName = $module->item(0)->nodeValue;

$module = $node->parentNode->getElementsByTagName( "channelType" );
$channelType = $module->item(0)->nodeValue;

コードの例を教えてください。すべての子で XML ノードを更新するにはどうすればよいですか?

よろしくお願いします。

4

1 に答える 1

-1

PHP SimpleXMLElement クラスと小さな XPathを使用したソリューションを次に示します。

<?php
$xml = <<<XML
<?xml version="1.0"?>
    <systemConfigs>
        <systemConfig cnfId="1">
        <moduleName>Module 1</moduleName>
        <channeles ch="1">
            <chId>1</chId>
            <channelName>Channel 1 of Module 1</channelName>
            <channelType>myFunc 1</channelType>
            <channelFunc>conFig</channelFunc>
            <eu>myFunc 1</eu>
            <custScale>myFunc 1</custScale>
            <rawMin>myFunc 1</rawMin>
            <rawMax>myFunc 1</rawMax>
            <euMin>myFunc 1</euMin>
            <euMax>myFunc 1</euMax>
            <dspFormat>myFunc 1</dspFormat>
            <digOfPrec>myFunc 1</digOfPrec>
        </channeles>
        <channeles ch="2">
            <chId>2</chId>
            <channelName>Channel 2 of Module 1</channelName>
            <channelType>myFunc 2</channelType>
            <channelFunc>conFig</channelFunc>
            <eu>myFunc 2</eu>
            <custScale>myFunc 2</custScale>
            <rawMin>myFunc 2</rawMin>
            <rawMax>myFunc 2</rawMax>
            <euMin>myFunc 2</euMin>
            <euMax>myFunc 2</euMax>
            <dspFormat>myFunc 2</dspFormat>
            <digOfPrec>myFunc 2</digOfPrec>
        </channeles>
    </systemConfig>
    <systemConfig cnfId="2">
        <moduleName>Module 2</moduleName>
        <channeles ch="3">
            <chId>3</chId>
            <channelName>Channel 1 of Module 2</channelName>
            <channelType>myFunc 1</channelType>
            <channelFunc>conFig</channelFunc>
            <eu>myFunc 1</eu>
            <custScale>myFunc 1</custScale>
            <rawMin>myFunc 1</rawMin>
            <rawMax>myFunc 1</rawMax>
            <euMin>myFunc 1</euMin>
            <euMax>myFunc 1</euMax>
            <dspFormat>myFunc 1</dspFormat>
            <digOfPrec>myFunc 1</digOfPrec>
        </channeles>
        <channeles ch="4">
            <chId>4</chId>
            <channelName>Channel 2 of Module 2</channelName>
            <channelType>myFunc 2</channelType>
            <channelFunc>conFig</channelFunc>
            <eu>myFunc 2</eu>
            <custScale>myFunc 2</custScale>
            <rawMin>myFunc 2</rawMin>
            <rawMax>myFunc 2</rawMax>
            <euMin>myFunc 2</euMin>
            <euMax>myFunc 2</euMax>
            <dspFormat>myFunc 2</dspFormat>
            <digOfPrec>myFunc 2</digOfPrec>
        </channeles>
    </systemConfig>
</systemConfigs>
XML;

// Create the SXE object
// You can read from file using the simplexml_load_file function
$sxe = new SimpleXMLElement($xml); 

// Fetch the right channel using XPath
$channele4 = $sxe->xpath('//channeles[contains(@ch, 4)]');

// Update the values you want
$channele4[0]->channelName = 'Channel New Name';
$channele4[0]->channelType = 'New Channel Type';

// Retrieve the parent (..) node
$systemConfig = $sxe->xpath('//channeles[contains(@ch, 4)]/..');

// Update the moduleName value
$systemConfig[0]->moduleName = 'New module name';

// Store the updated values in the $xml variable
$xml = $sxe->asXML();

// Print the updated XML
echo $xml;

注:リモート ソースから XML をロードする場合、SXE オブジェクトのインスタンス化は次のように行う必要があります。

$url = "http://domain.com/abc.xml";
$sxe = new SimpleXMLElement($url, NULL, TRUE);
于 2013-04-24T23:52:53.457 に答える