2013-04-24 103 views
0

我有一個xml的多級節點。 我可以找到節點,但需要知道如何更新節點值。 在我的文件中,我可以通過它的屬性找到節點通道,但是如何更新像channelType或其他節點的值?更新XML所有子節點值按PHP中的屬性進行搜索

這是我的代碼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節點與所有孩子?

在此先感謝您的幫助。

回答

-1

下面是一個使用PHP SimpleXMLElement class和一點點的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); 
+0

我得到錯誤,使用simplexml_load_file(FileName.xml)和錯誤指向行$ sxe = new SimpleXMLElement($ xml);說:「開始標記預期','''' – Sonnet 2013-04-25 01:37:24

+0

我得到錯誤,在使用您的代碼後,錯誤指向行$ sxe = new SimpleXMLElement($ xml);說:「開始標籤預期,'''」請幫助。 – Sonnet 2013-04-25 01:50:06

+0

你確定你複製+粘貼了我的代碼嗎?看到它在這裏工作http://codepad.org/gjHpclps。 順便說一句,你能告訴我,當你在那行之前回顯$ xml變量時會出現什麼? SimpleXMLElement構造函數需要一個有效的XML字符串作爲第一個參數,也許你傳遞的值不是。 – 2013-04-25 09:07:14