2013-12-12 2 views
3

안녕하세요, 나는 여러 xml 피드를 구문 분석하고 하나로 결합하여 나를 위해 잘 작동하지만 지금은 특정 노드 값에 일부 접두사를 추가해야하기 때문에 한 지점에서 조금 붙어 있습니다. 그 노드의 값을 변경해야한다는 뜻입니다. 여기에 내가 원하는 실제 코드 몇 가지를 제공하고있다.PHP를 사용하여 XML에서 특정 노드 값을 대체

내가 여기에이 <JobId>0-45984</JobId>

같은 접두사를 추가하려면 위의 XML에서 XML

<JobRecords> 
    <JobRecord> 
     <Brand>Corporate1</Brand> 
     <JobId>45982</JobId> 
     <WorkTypes> 
      <WorkTypeRecord> 
       <Title>Permanent1</Title> 
      </WorkTypeRecord> 
     </WorkTypes> 
    </JobRecord> 
    <JobRecord> 
     <Brand>Corporate2</Brand> 
     <JobId>45983</JobId> 
     <WorkTypes> 
      <WorkTypeRecord> 
       <Title>Permanent2</Title> 
      </WorkTypeRecord> 
     </WorkTypes> 
    </JobRecord> 
    <JobRecord> 
     <Brand>Corporate3</Brand> 
     <JobId>45984</JobId> 
     <WorkTypes> 
      <WorkTypeRecord> 
       <Title>Permanent3</Title> 
      </WorkTypeRecord> 
     </WorkTypes> 
    </JobRecord> 
</JobRecords>  

위와 같이 넣어 하나 알려주지에 다른 XML 피드를 결합 PHP 코드입니다 .

<?php 
    $feed1 = "data1.xml"; 
    $feed2 = "data2.xml"; 
    $feed3 = "data3.xml"; 

    $xml1 = new DOMDocument('1.0', 'UTF-8'); 
    $xml1->load($feed1); 

    $xml2 = new DOMDocument('1.0', 'UTF-8'); 
    $xml2->load($feed2); 

    $xml3 = new DOMDocument('1.0', 'UTF-8'); 
    $xml3->load($feed3); 

    $addXml = array(); 
    $addXml[] = $xml1->saveXML(); 
    $addXml[] = $xml2->saveXML(); 
    $addXml[] = $xml3->saveXML(); 

    // create a new document 
    $dom = new DOMDocument(); 
    $dom->appendChild($dom->createElement('JobRecords')); 

    foreach ($addXml as $xml) { 
     $addDom = new DOMDocument(); 
     $addDom->loadXml($xml); 
     if ($addDom->documentElement) { 
     foreach ($addDom->documentElement->childNodes as $node) { 
      $dom->documentElement->appendChild(
      $dom->importNode($node, TRUE) 
     ); 
     } 
     } 
    } 

    $xmlFinal = $dom->saveXml(); 
    echo $xmlFinal; 
?> 

지금까지 시도했지만 성공하지 못했습니다. 어떻게 달성 할 수 있는지 알려주세요.
미리 감사드립니다.

답변

4

의 수정 및 확인하고 다음과 같이 노드를 교체해야합니다. 여기 $xmlData에는 XML 문자열이 들어 있습니다. 당신은 데모를 here

1

previous answer의 두 번째 예의 경우처럼 왜 XML 피드가 루프 내에 직접로드되지 않는지 잘 모르겠습니다.

대상, 문서에 'JobRecord'요소를 가져온 후, 당신은 아이를 작업 ID 찾아서 당신은 뿌리에서 반복 할 수 nodeValue를 재산

$files= array(
    'xml1.xml', 
    'xml2.xml', 
    'xml3.xml' 
    // ... more xmls 
); 

$dom = new DOMDocument(); 
$dom->appendChild($dom->createElement('JobRecords')); 
// get an xpath object 
$xpath = new DOMXpath($dom); 

// $index variable for later use 
foreach ($files as $index => $filename) { 
    $addDom = new DOMDocument(); 
    $addDom->load($filename); 
    if ($addDom->documentElement) { 
    foreach ($addDom->documentElement->childNodes as $node) { 
     $dom->documentElement->appendChild(
     $record = $dom->importNode($node, TRUE) 
    ); 
     // find the jobId child elements (should be only one) 
     $jobIds = $xpath->evaluate('./JobId', $record); 
     foreach ($jobIds as $jobId) { 
     // prefix the value with the index 
     $jobId->nodeValue = $index.'-'.$jobId->nodeValue; 
     } 
    } 
    } 
} 

echo $dom->saveXml(); 
+0

아무것도 작동하지 찾을 수 있습니다

$dom = new DOMDocument(); $dom->loadXML($xmlData); foreach ($dom->documentElement->childNodes as $node) { //print_r($node); if($node->nodeType==1){ $OldJobId = $node->getElementsByTagName('JobId')->Item(0); $newelement = $dom->createElement('JobId','0-'.$OldJobId->nodeValue); $OldJobId->parentNode->replaceChild($newelement, $OldJobId); } } $str = $dom->saveXML($dom->documentElement); echo $str; 

당신이 당신의 대답에 다시 봐 주시기 바랍니다 수있는이 답을 발생합니다. –

+0

안녕하세요, 위의 코드를 시도했지만 위의 코드 사람과 아무 일도 발생하지 않습니다. jobId의 값이 전혀 변경되지 않았습니다. –

+0

잘 작동합니다. 나는 그것을 로컬에서 테스트했다. https://eval.in/78610 (xml 텍스트 사용으로 변경). – ThW

관련 문제